)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"dbe9da8b880a36039abe927d2e8ae055232b76a8","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Stephen Finucane \u003csfinucan@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-11-18 15:48:07 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"tests: Validate NUMA topology + huge page combo"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When assigning huge pages to an instance, a NUMA topology will"},{"line_number":10,"context_line":"automatically be added. Verify this."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"5a74a57a_fe0c1a96","line":7,"range":{"start_line":7,"start_character":16,"end_line":7,"end_character":29},"updated":"2016-11-24 16:01:58.000000000","message":"Nit: having this here confused me a bit, but I get what you mean I think.","commit_id":"7b8828832a573aaa1c0e9dfc71b6343c9038e298"}],"nova/tests/functional/libvirt/test_numa_servers.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"dbe9da8b880a36039abe927d2e8ae055232b76a8","unresolved":false,"context_lines":[{"line_number":196,"context_line":""},{"line_number":197,"context_line":"        host_info \u003d NumaHostInfo(cpu_nodes\u003d1, cpu_sockets\u003d2, cpu_cores\u003d2,"},{"line_number":198,"context_line":"                                 cpu_threads\u003d2, kB_mem\u003d15740000,"},{"line_number":199,"context_line":"                                 numa_mempages_list\u003dcell_mempages)"},{"line_number":200,"context_line":"        fake_connection \u003d self._get_connection(host_info\u003dhost_info)"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"        # Create a flavor"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a74a57a_fe9fba00","line":199,"range":{"start_line":199,"start_character":33,"end_line":199,"end_character":51},"updated":"2016-11-24 16:01:58.000000000","message":"This seems to be wrong, based on the logs?\nhttps://github.com/openstack/nova/blob/b2fd340e46ea895d01b9bb80f8a3ed14fb5843ca/nova/tests/unit/virt/libvirt/fakelibvirt.py#L282\n\nI guess you just have to pop that from the kwargs or something on ln39?","commit_id":"7b8828832a573aaa1c0e9dfc71b6343c9038e298"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"dbe9da8b880a36039abe927d2e8ae055232b76a8","unresolved":false,"context_lines":[{"line_number":219,"context_line":"            self.assertEqual(\u0027large\u0027,"},{"line_number":220,"context_line":"                             inst.numa_topology.cells[0].cpu_topology.pagesize)"},{"line_number":221,"context_line":"            self.assertEqual(1, len(inst.numa_topology.cells))"},{"line_number":222,"context_line":"            self.assertEqual(4, inst.numa_topology.cells[0].cpu_topology.cores)"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"    def test_create_server_with_numa_fails(self):"},{"line_number":225,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5a74a57a_de2e7ef9","line":222,"updated":"2016-11-24 16:01:58.000000000","message":"I kinda hoped we could do better checks of the final libvirt state, but this seems consistent with the other tests here, and does move us forward.","commit_id":"7b8828832a573aaa1c0e9dfc71b6343c9038e298"},{"author":{"_account_id":8175,"name":"Rafael Folco","email":"rfolco@redhat.com","username":"rfolco"},"change_message_id":"57771f4ee82eea1569aae5b878f0843bcb9582e6","unresolved":false,"context_lines":[{"line_number":215,"context_line":"            ctx \u003d nova_context.get_admin_context()"},{"line_number":216,"context_line":"            inst \u003d objects.Instance.get_by_uuid(ctx, server[\u0027id\u0027])"},{"line_number":217,"context_line":"            cells \u003d inst.numa_topology.cells"},{"line_number":218,"context_line":"            self.assertEqual(2048, cells[0].pagesize)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a74a57a_517d33e6","line":218,"range":{"start_line":218,"start_character":44,"end_line":218,"end_character":52},"updated":"2016-11-30 12:16:48.000000000","message":"I\u0027d add another assert here..checking if number of huge pages are correct would make the test more robust. You check if the NUMA topology is there AND if the values are accurate.","commit_id":"14db34ff70b0b9de6fc2ed7bbb63cf8d47fd828c"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e20f6572e5c13118bccc70aa03185f199ec3dc93","unresolved":false,"context_lines":[{"line_number":215,"context_line":"            ctx \u003d nova_context.get_admin_context()"},{"line_number":216,"context_line":"            inst \u003d objects.Instance.get_by_uuid(ctx, server[\u0027id\u0027])"},{"line_number":217,"context_line":"            cells \u003d inst.numa_topology.cells"},{"line_number":218,"context_line":"            self.assertEqual(2048, cells[0].pagesize)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a71b18c_4ced2aee","line":218,"range":{"start_line":218,"start_character":44,"end_line":218,"end_character":52},"in_reply_to":"5a74a57a_517d33e6","updated":"2016-12-05 15:20:55.000000000","message":"We can\u0027t do that, or not in this way at least. The \u0027InstanceNUMACell\u0027 object, defined in \u0027nova/objects/instance_numa_topology.py\u0027, only defines \u0027pagesize\u0027 and \u0027memory\u0027 fields. I guess this is because all pages on a instance must be the same size. I have checked the \u0027memory\u0027 field, but that\u0027s as good as we can get without inspecting the underlying XML. We will inspect the XML, but in a later patch (more tests need fixing here)","commit_id":"14db34ff70b0b9de6fc2ed7bbb63cf8d47fd828c"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"be3f979e04a6475144c080bffc94e61cc6f7f91a","unresolved":false,"context_lines":[{"line_number":210,"context_line":""},{"line_number":211,"context_line":"        # Create a flavor"},{"line_number":212,"context_line":"        extra_spec \u003d {"},{"line_number":213,"context_line":"            \u0027hw:mem_page_size\u0027: \u0027large\u0027,"},{"line_number":214,"context_line":"        }"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"        flavor_id \u003d self._create_flavor(memory_mb\u003d2048, vcpu\u003d4,"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a430d35_8a2b1e94","line":213,"updated":"2017-02-09 17:50:33.000000000","message":"Have I mentioned that \u0027large\u0027 and \u0027small\u0027 should never have been permitted as configuration values for mem_page_size? :(\n\nYou may want to add a code comment above saying \"hey, \u0027large\u0027 is an alias for 2MB huge page size.\"","commit_id":"e92568c8a71663440e75ae475454b4c3a2dc8063"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1791c06105d5e94228a38f744a74624eebf67de0","unresolved":false,"context_lines":[{"line_number":210,"context_line":""},{"line_number":211,"context_line":"        # Create a flavor"},{"line_number":212,"context_line":"        extra_spec \u003d {"},{"line_number":213,"context_line":"            \u0027hw:mem_page_size\u0027: \u0027large\u0027,"},{"line_number":214,"context_line":"        }"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"        flavor_id \u003d self._create_flavor(memory_mb\u003d2048, vcpu\u003d4,"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba2be162_c26266ad","line":213,"in_reply_to":"1a430d35_8a2b1e94","updated":"2017-02-28 15:20:22.000000000","message":"Done","commit_id":"e92568c8a71663440e75ae475454b4c3a2dc8063"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"be3f979e04a6475144c080bffc94e61cc6f7f91a","unresolved":false,"context_lines":[{"line_number":228,"context_line":"            inst \u003d objects.Instance.get_by_uuid(ctx, server[\u0027id\u0027])"},{"line_number":229,"context_line":"            cells \u003d inst.numa_topology.cells"},{"line_number":230,"context_line":"            self.assertEqual(1, len(cells))"},{"line_number":231,"context_line":"            self.assertEqual(2048, cells[0].pagesize)"},{"line_number":232,"context_line":"            self.assertEqual(2048, cells[0].memory)"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a430d35_cd77009e","line":231,"updated":"2017-02-09 17:50:33.000000000","message":"note: in KB...","commit_id":"e92568c8a71663440e75ae475454b4c3a2dc8063"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1791c06105d5e94228a38f744a74624eebf67de0","unresolved":false,"context_lines":[{"line_number":228,"context_line":"            inst \u003d objects.Instance.get_by_uuid(ctx, server[\u0027id\u0027])"},{"line_number":229,"context_line":"            cells \u003d inst.numa_topology.cells"},{"line_number":230,"context_line":"            self.assertEqual(1, len(cells))"},{"line_number":231,"context_line":"            self.assertEqual(2048, cells[0].pagesize)"},{"line_number":232,"context_line":"            self.assertEqual(2048, cells[0].memory)"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba2be162_02147ef3","line":231,"in_reply_to":"1a430d35_cd77009e","updated":"2017-02-28 15:20:22.000000000","message":"Done","commit_id":"e92568c8a71663440e75ae475454b4c3a2dc8063"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"be3f979e04a6475144c080bffc94e61cc6f7f91a","unresolved":false,"context_lines":[{"line_number":229,"context_line":"            cells \u003d inst.numa_topology.cells"},{"line_number":230,"context_line":"            self.assertEqual(1, len(cells))"},{"line_number":231,"context_line":"            self.assertEqual(2048, cells[0].pagesize)"},{"line_number":232,"context_line":"            self.assertEqual(2048, cells[0].memory)"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a430d35_2d67a4eb","line":232,"updated":"2017-02-09 17:50:33.000000000","message":"note: in MB...\n\nle sigh.","commit_id":"e92568c8a71663440e75ae475454b4c3a2dc8063"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1791c06105d5e94228a38f744a74624eebf67de0","unresolved":false,"context_lines":[{"line_number":229,"context_line":"            cells \u003d inst.numa_topology.cells"},{"line_number":230,"context_line":"            self.assertEqual(1, len(cells))"},{"line_number":231,"context_line":"            self.assertEqual(2048, cells[0].pagesize)"},{"line_number":232,"context_line":"            self.assertEqual(2048, cells[0].memory)"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba2be162_c20986df","line":232,"in_reply_to":"1a430d35_2d67a4eb","updated":"2017-02-28 15:20:22.000000000","message":"Done","commit_id":"e92568c8a71663440e75ae475454b4c3a2dc8063"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"999255495aab6129fecd4d688c9dd2354818d43b","unresolved":false,"context_lines":[{"line_number":201,"context_line":"        # small pages"},{"line_number":202,"context_line":"        for cell in host_info.numa_topology.cells:"},{"line_number":203,"context_line":"            huge_pages \u003d 1024"},{"line_number":204,"context_line":"            small_pages \u003d (host_info.kB_mem - (2048 * huge_pages)) / 4"},{"line_number":205,"context_line":"            cell.mempages \u003d fakelibvirt.create_mempages([(2048, huge_pages),"},{"line_number":206,"context_line":"                                                         (4, small_pages)])"},{"line_number":207,"context_line":"        fake_connection \u003d self._get_connection(host_info\u003dhost_info)"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a1ff146_f9dc1fe6","line":204,"updated":"2017-03-16 13:53:50.000000000","message":"You\u0027re going to need to math.floor or math.ceil this, since it\u0027s blowing up the test on python 3.5:\n\nft1.1: nova.tests.functional.libvirt.test_numa_servers.HugepageServersTest.test_create_server_with_hugepages_StringException: Empty attachments:\n  stdout\n\npythonlogging:\u0027\u0027: {{{\n2017-03-16 10:15:17,947 INFO [nova.service] Starting conductor node (version 15.0.0)\n2017-03-16 10:15:17,971 INFO [nova.service] Starting consoleauth node (version 15.0.0)\n2017-03-16 10:15:17,985 INFO [nova.network.driver] Loading network driver \u0027nova.network.linux_net\u0027\n2017-03-16 10:15:17,993 INFO [nova.service] Starting network node (version 15.0.0)\n2017-03-16 10:15:18,071 INFO [nova.service] Starting scheduler node (version 15.0.0)\n2017-03-16 10:15:19,117 INFO [nova.api.openstack] Loaded extensions: [\u0027extensions\u0027, \u0027flavors\u0027, \u0027image-metadata\u0027, \u0027image-size\u0027, \u0027images\u0027, \u0027ips\u0027, \u0027limits\u0027, \u0027os-admin-actions\u0027, \u0027os-admin-password\u0027, \u0027os-agents\u0027, \u0027os-aggregates\u0027, \u0027os-assisted-volume-snapshots\u0027, \u0027os-attach-interfaces\u0027, \u0027os-availability-zone\u0027, \u0027os-baremetal-nodes\u0027, \u0027os-block-device-mapping\u0027, \u0027os-cells\u0027, \u0027os-certificates\u0027, \u0027os-cloudpipe\u0027, \u0027os-config-drive\u0027, \u0027os-console-auth-tokens\u0027, \u0027os-console-output\u0027, \u0027os-consoles\u0027, \u0027os-create-backup\u0027, \u0027os-deferred-delete\u0027, \u0027os-evacuate\u0027, \u0027os-extended-availability-zone\u0027, \u0027os-extended-server-attributes\u0027, \u0027os-extended-status\u0027, \u0027os-extended-volumes\u0027, \u0027os-fixed-ips\u0027, \u0027os-flavor-access\u0027, \u0027os-flavor-extra-specs\u0027, \u0027os-flavor-manage\u0027, \u0027os-flavor-rxtx\u0027, \u0027os-floating-ip-dns\u0027, \u0027os-floating-ip-pools\u0027, \u0027os-floating-ips\u0027, \u0027os-floating-ips-bulk\u0027, \u0027os-fping\u0027, \u0027os-hide-server-addresses\u0027, \u0027os-hosts\u0027, \u0027os-hypervisors\u0027, \u0027os-instance-actions\u0027, \u0027os-instance-usage-audit-log\u0027, \u0027os-keypairs\u0027, \u0027os-lock-server\u0027, \u0027os-migrate-server\u0027, \u0027os-migrations\u0027, \u0027os-multinic\u0027, \u0027os-multiple-create\u0027, \u0027os-networks\u0027, \u0027os-networks-associate\u0027, \u0027os-pause-server\u0027, \u0027os-quota-class-sets\u0027, \u0027os-quota-sets\u0027, \u0027os-remote-consoles\u0027, \u0027os-rescue\u0027, \u0027os-scheduler-hints\u0027, \u0027os-security-group-default-rules\u0027, \u0027os-security-groups\u0027, \u0027os-server-diagnostics\u0027, \u0027os-server-external-events\u0027, \u0027os-server-groups\u0027, \u0027os-server-password\u0027, \u0027os-server-tags\u0027, \u0027os-server-usage\u0027, \u0027os-services\u0027, \u0027os-shelve\u0027, \u0027os-simple-tenant-usage\u0027, \u0027os-suspend-server\u0027, \u0027os-tenant-networks\u0027, \u0027os-used-limits\u0027, \u0027os-user-data\u0027, \u0027os-virtual-interfaces\u0027, \u0027os-volumes\u0027, \u0027server-metadata\u0027, \u0027server-migrations\u0027, \u0027servers\u0027, \u0027versions\u0027]\n2017-03-16 10:15:20,229 INFO [nova.api.openstack] Loaded extensions: [\u0027extensions\u0027, \u0027flavors\u0027, \u0027image-metadata\u0027, \u0027image-size\u0027, \u0027images\u0027, \u0027ips\u0027, \u0027limits\u0027, \u0027os-admin-actions\u0027, \u0027os-admin-password\u0027, \u0027os-agents\u0027, \u0027os-aggregates\u0027, \u0027os-assisted-volume-snapshots\u0027, \u0027os-attach-interfaces\u0027, \u0027os-availability-zone\u0027, \u0027os-baremetal-nodes\u0027, \u0027os-block-device-mapping\u0027, \u0027os-cells\u0027, \u0027os-certificates\u0027, \u0027os-cloudpipe\u0027, \u0027os-config-drive\u0027, \u0027os-console-auth-tokens\u0027, \u0027os-console-output\u0027, \u0027os-consoles\u0027, \u0027os-create-backup\u0027, \u0027os-deferred-delete\u0027, \u0027os-evacuate\u0027, \u0027os-extended-availability-zone\u0027, \u0027os-extended-server-attributes\u0027, \u0027os-extended-status\u0027, \u0027os-extended-volumes\u0027, \u0027os-fixed-ips\u0027, \u0027os-flavor-access\u0027, \u0027os-flavor-extra-specs\u0027, \u0027os-flavor-manage\u0027, \u0027os-flavor-rxtx\u0027, \u0027os-floating-ip-dns\u0027, \u0027os-floating-ip-pools\u0027, \u0027os-floating-ips\u0027, \u0027os-floating-ips-bulk\u0027, \u0027os-fping\u0027, \u0027os-hide-server-addresses\u0027, \u0027os-hosts\u0027, \u0027os-hypervisors\u0027, \u0027os-instance-actions\u0027, \u0027os-instance-usage-audit-log\u0027, \u0027os-keypairs\u0027, \u0027os-lock-server\u0027, \u0027os-migrate-server\u0027, \u0027os-migrations\u0027, \u0027os-multinic\u0027, \u0027os-multiple-create\u0027, \u0027os-networks\u0027, \u0027os-networks-associate\u0027, \u0027os-pause-server\u0027, \u0027os-quota-class-sets\u0027, \u0027os-quota-sets\u0027, \u0027os-remote-consoles\u0027, \u0027os-rescue\u0027, \u0027os-scheduler-hints\u0027, \u0027os-security-group-default-rules\u0027, \u0027os-security-groups\u0027, \u0027os-server-diagnostics\u0027, \u0027os-server-external-events\u0027, \u0027os-server-groups\u0027, \u0027os-server-password\u0027, \u0027os-server-tags\u0027, \u0027os-server-usage\u0027, \u0027os-services\u0027, \u0027os-shelve\u0027, \u0027os-simple-tenant-usage\u0027, \u0027os-suspend-server\u0027, \u0027os-tenant-networks\u0027, \u0027os-used-limits\u0027, \u0027os-user-data\u0027, \u0027os-virtual-interfaces\u0027, \u0027os-volumes\u0027, \u0027server-metadata\u0027, \u0027server-migrations\u0027, \u0027servers\u0027, \u0027versions\u0027]\n2017-03-16 10:15:20,232 INFO [nova.wsgi] osapi_compute listening on 127.0.0.1:43474\n2017-03-16 10:15:20,246 INFO [nova.service] Starting conductor node (version 15.0.0)\n2017-03-16 10:15:20,250 INFO [nova.osapi_compute.wsgi.server] (3978) wsgi starting up on http://127.0.0.1:43474\n2017-03-16 10:15:20,259 INFO [nova.wsgi] placement listening on 127.0.0.1:40846\n2017-03-16 10:15:20,264 INFO [nova.placement.wsgi.server] (3978) wsgi starting up on http://127.0.0.1:40846\n2017-03-16 10:15:20,267 INFO [nova.osapi_compute.wsgi.server] 127.0.0.1 \"GET /v2 HTTP/1.1\" status: 204 len: 350 time: 0.0020311\n2017-03-16 10:15:21,763 INFO [nova.osapi_compute.wsgi.server] 127.0.0.1 \"GET /v2/6f70656e737461636b20342065766572//flavors/detail HTTP/1.1\" status: 200 len: 2267 time: 1.4914370\n2017-03-16 10:15:21,771 INFO [nova.osapi_compute.wsgi.server] 127.0.0.1 \"GET /v2 HTTP/1.1\" status: 204 len: 351 time: 0.0014822\n2017-03-16 10:15:21,932 INFO [nova.osapi_compute.wsgi.server] 127.0.0.1 \"POST /v2/6f70656e737461636b20342065766572//flavors HTTP/1.1\" status: 200 len: 646 time: 0.1561708\n2017-03-16 10:15:22,006 INFO [nova.osapi_compute.wsgi.server] 127.0.0.1 \"POST /v2/6f70656e737461636b20342065766572//flavors/75903183/os-extra_specs HTTP/1.1\" status: 200 len: 242 time: 0.0678232\n2017-03-16 10:15:22,028 INFO [nova.virt.driver] Loading compute driver \u0027libvirt.LibvirtDriver\u0027\n2017-03-16 10:15:22,043 WARNING [os_brick.initiator.connectors.remotefs] Connection details not present. RemoteFsClient may not initialize properly.\n2017-03-16 10:15:22,044 INFO [nova.service] Starting compute node (version 15.0.0)\n2017-03-16 10:15:22,046 INFO [nova.virt.libvirt.host] Libvirt host capabilities \u003ccapabilities\u003e\n  \u003chost\u003e\n    \u003cuuid\u003ecef19ce0-0ca2-11df-855d-b19fbce37686\u003c/uuid\u003e\n    \u003ccpu\u003e\n      \u003carch\u003ex86_64\u003c/arch\u003e\n      \u003cmodel\u003ePenryn\u003c/model\u003e\n      \u003cvendor\u003eIntel\u003c/vendor\u003e\n      \u003ctopology sockets\u003d\u00272\u0027 cores\u003d\u00272\u0027 threads\u003d\u00272\u0027/\u003e\n      \u003cfeature name\u003d\u0027xtpr\u0027/\u003e\n      \u003cfeature name\u003d\u0027tm2\u0027/\u003e\n      \u003cfeature name\u003d\u0027est\u0027/\u003e\n      \u003cfeature name\u003d\u0027vmx\u0027/\u003e\n      \u003cfeature name\u003d\u0027ds_cpl\u0027/\u003e\n      \u003cfeature name\u003d\u0027monitor\u0027/\u003e\n      \u003cfeature name\u003d\u0027pbe\u0027/\u003e\n      \u003cfeature name\u003d\u0027tm\u0027/\u003e\n      \u003cfeature name\u003d\u0027ht\u0027/\u003e\n      \u003cfeature name\u003d\u0027ss\u0027/\u003e\n      \u003cfeature name\u003d\u0027acpi\u0027/\u003e\n      \u003cfeature name\u003d\u0027ds\u0027/\u003e\n      \u003cfeature name\u003d\u0027vme\u0027/\u003e\n    \u003c/cpu\u003e\n    \u003cmigration_features\u003e\n      \u003clive/\u003e\n      \u003curi_transports\u003e\n        \u003curi_transport\u003etcp\u003c/uri_transport\u003e\n      \u003c/uri_transports\u003e\n    \u003c/migration_features\u003e\n    \u003ctopology\u003e\n  \u003ccells num\u003d\"1\"\u003e\n    \u003ccell id\u003d\"0\"\u003e\n      \u003cmemory unit\u003d\"KiB\"\u003e16777216\u003c/memory\u003e\n      \u003cpages size\u003d\"2048\" unit\u003d\"KiB\"\u003e1024\u003c/pages\u003e\n      \u003cpages size\u003d\"4\" unit\u003d\"KiB\"\u003e3670016.0\u003c/pages\u003e\n      \u003ccpus num\u003d\"8\"\u003e\n        \u003ccpu id\u003d\"0\" socket_id\u003d\"0\" core_id\u003d\"0\" siblings\u003d\"0-1\"/\u003e\n        \u003ccpu id\u003d\"1\" socket_id\u003d\"0\" core_id\u003d\"0\" siblings\u003d\"0-1\"/\u003e\n        \u003ccpu id\u003d\"2\" socket_id\u003d\"0\" core_id\u003d\"1\" siblings\u003d\"2-3\"/\u003e\n        \u003ccpu id\u003d\"3\" socket_id\u003d\"0\" core_id\u003d\"1\" siblings\u003d\"2-3\"/\u003e\n        \u003ccpu id\u003d\"4\" socket_id\u003d\"0\" core_id\u003d\"0\" siblings\u003d\"4-5\"/\u003e\n        \u003ccpu id\u003d\"5\" socket_id\u003d\"0\" core_id\u003d\"0\" siblings\u003d\"4-5\"/\u003e\n        \u003ccpu id\u003d\"6\" socket_id\u003d\"0\" core_id\u003d\"1\" siblings\u003d\"6-7\"/\u003e\n        \u003ccpu id\u003d\"7\" socket_id\u003d\"0\" core_id\u003d\"1\" siblings\u003d\"6-7\"/\u003e\n      \u003c/cpus\u003e\n    \u003c/cell\u003e\n  \u003c/cells\u003e\n\u003c/topology\u003e\n\n    \u003csecmodel\u003e\n      \u003cmodel\u003eapparmor\u003c/model\u003e\n      \u003cdoi\u003e0\u003c/doi\u003e\n    \u003c/secmodel\u003e\n  \u003c/host\u003e\n\n  \u003cguest\u003e\n    \u003cos_type\u003ehvm\u003c/os_type\u003e\n    \u003carch name\u003d\u0027i686\u0027\u003e\n      \u003cwordsize\u003e32\u003c/wordsize\u003e\n      \u003cemulator\u003e/usr/bin/qemu\u003c/emulator\u003e\n      \u003cmachine\u003epc-0.14\u003c/machine\u003e\n      \u003cmachine canonical\u003d\u0027pc-0.14\u0027\u003epc\u003c/machine\u003e\n      \u003cmachine\u003epc-0.13\u003c/machine\u003e\n      \u003cmachine\u003epc-0.12\u003c/machine\u003e\n      \u003cmachine\u003epc-0.11\u003c/machine\u003e\n      \u003cmachine\u003epc-0.10\u003c/machine\u003e\n      \u003cmachine\u003eisapc\u003c/machine\u003e\n      \u003cdomain type\u003d\u0027qemu\u0027\u003e\n      \u003c/domain\u003e\n      \u003cdomain type\u003d\u0027kvm\u0027\u003e\n        \u003cemulator\u003e/usr/bin/kvm\u003c/emulator\u003e\n        \u003cmachine\u003epc-0.14\u003c/machine\u003e\n        \u003cmachine canonical\u003d\u0027pc-0.14\u0027\u003epc\u003c/machine\u003e\n        \u003cmachine\u003epc-0.13\u003c/machine\u003e\n        \u003cmachine\u003epc-0.12\u003c/machine\u003e\n        \u003cmachine\u003epc-0.11\u003c/machine\u003e\n        \u003cmachine\u003epc-0.10\u003c/machine\u003e\n        \u003cmachine\u003eisapc\u003c/machine\u003e\n      \u003c/domain\u003e\n    \u003c/arch\u003e\n    \u003cfeatures\u003e\n      \u003ccpuselection/\u003e\n      \u003cdeviceboot/\u003e\n      \u003cpae/\u003e\n      \u003cnonpae/\u003e\n      \u003cacpi default\u003d\u0027on\u0027 toggle\u003d\u0027yes\u0027/\u003e\n      \u003capic default\u003d\u0027on\u0027 toggle\u003d\u0027no\u0027/\u003e\n    \u003c/features\u003e\n  \u003c/guest\u003e\n\n  \u003cguest\u003e\n    \u003cos_type\u003ehvm\u003c/os_type\u003e\n    \u003carch name\u003d\u0027x86_64\u0027\u003e\n      \u003cwordsize\u003e64\u003c/wordsize\u003e\n      \u003cemulator\u003e/usr/bin/qemu-system-x86_64\u003c/emulator\u003e\n      \u003cmachine\u003epc-0.14\u003c/machine\u003e\n      \u003cmachine canonical\u003d\u0027pc-0.14\u0027\u003epc\u003c/machine\u003e\n      \u003cmachine\u003epc-0.13\u003c/machine\u003e\n      \u003cmachine\u003epc-0.12\u003c/machine\u003e\n      \u003cmachine\u003epc-0.11\u003c/machine\u003e\n      \u003cmachine\u003epc-0.10\u003c/machine\u003e\n      \u003cmachine\u003eisapc\u003c/machine\u003e\n      \u003cdomain type\u003d\u0027qemu\u0027\u003e\n      \u003c/domain\u003e\n      \u003cdomain type\u003d\u0027kvm\u0027\u003e\n        \u003cemulator\u003e/usr/bin/kvm\u003c/emulator\u003e\n        \u003cmachine\u003epc-0.14\u003c/machine\u003e\n        \u003cmachine canonical\u003d\u0027pc-0.14\u0027\u003epc\u003c/machine\u003e\n        \u003cmachine\u003epc-0.13\u003c/machine\u003e\n        \u003cmachine\u003epc-0.12\u003c/machine\u003e\n        \u003cmachine\u003epc-0.11\u003c/machine\u003e\n        \u003cmachine\u003epc-0.10\u003c/machine\u003e\n        \u003cmachine\u003eisapc\u003c/machine\u003e\n      \u003c/domain\u003e\n    \u003c/arch\u003e\n    \u003cfeatures\u003e\n      \u003ccpuselection/\u003e\n      \u003cdeviceboot/\u003e\n      \u003cacpi default\u003d\u0027on\u0027 toggle\u003d\u0027yes\u0027/\u003e\n      \u003capic default\u003d\u0027on\u0027 toggle\u003d\u0027no\u0027/\u003e\n    \u003c/features\u003e\n  \u003c/guest\u003e\n\n  \u003cguest\u003e\n    \u003cos_type\u003ehvm\u003c/os_type\u003e\n    \u003carch name\u003d\u0027armv7l\u0027\u003e\n      \u003cwordsize\u003e32\u003c/wordsize\u003e\n      \u003cemulator\u003e/usr/bin/qemu-system-arm\u003c/emulator\u003e\n      \u003cmachine\u003eintegratorcp\u003c/machine\u003e\n      \u003cmachine\u003evexpress-a9\u003c/machine\u003e\n      \u003cmachine\u003esyborg\u003c/machine\u003e\n      \u003cmachine\u003emusicpal\u003c/machine\u003e\n      \u003cmachine\u003emainstone\u003c/machine\u003e\n      \u003cmachine\u003en800\u003c/machine\u003e\n      \u003cmachine\u003en810\u003c/machine\u003e\n      \u003cmachine\u003en900\u003c/machine\u003e\n      \u003cmachine\u003echeetah\u003c/machine\u003e\n      \u003cmachine\u003esx1\u003c/machine\u003e\n      \u003cmachine\u003esx1-v1\u003c/machine\u003e\n      \u003cmachine\u003ebeagle\u003c/machine\u003e\n      \u003cmachine\u003ebeaglexm\u003c/machine\u003e\n      \u003cmachine\u003etosa\u003c/machine\u003e\n      \u003cmachine\u003eakita\u003c/machine\u003e\n      \u003cmachine\u003espitz\u003c/machine\u003e\n      \u003cmachine\u003eborzoi\u003c/machine\u003e\n      \u003cmachine\u003eterrier\u003c/machine\u003e\n      \u003cmachine\u003econnex\u003c/machine\u003e\n      \u003cmachine\u003everdex\u003c/machine\u003e\n      \u003cmachine\u003elm3s811evb\u003c/machine\u003e\n      \u003cmachine\u003elm3s6965evb\u003c/machine\u003e\n      \u003cmachine\u003erealview-eb\u003c/machine\u003e\n      \u003cmachine\u003erealview-eb-mpcore\u003c/machine\u003e\n      \u003cmachine\u003erealview-pb-a8\u003c/machine\u003e\n      \u003cmachine\u003erealview-pbx-a9\u003c/machine\u003e\n      \u003cmachine\u003eversatilepb\u003c/machine\u003e\n      \u003cmachine\u003eversatileab\u003c/machine\u003e\n      \u003cdomain type\u003d\u0027qemu\u0027\u003e\n      \u003c/domain\u003e\n    \u003c/arch\u003e\n    \u003cfeatures\u003e\n      \u003cdeviceboot/\u003e\n    \u003c/features\u003e\n  \u003c/guest\u003e\n\n  \u003cguest\u003e\n    \u003cos_type\u003ehvm\u003c/os_type\u003e\n    \u003carch name\u003d\u0027mips\u0027\u003e\n      \u003cwordsize\u003e32\u003c/wordsize\u003e\n      \u003cemulator\u003e/usr/bin/qemu-system-mips\u003c/emulator\u003e\n      \u003cmachine\u003emalta\u003c/machine\u003e\n      \u003cmachine\u003emipssim\u003c/machine\u003e\n      \u003cmachine\u003emagnum\u003c/machine\u003e\n      \u003cmachine\u003epica61\u003c/machine\u003e\n      \u003cmachine\u003emips\u003c/machine\u003e\n      \u003cdomain type\u003d\u0027qemu\u0027\u003e\n      \u003c/domain\u003e\n    \u003c/arch\u003e\n    \u003cfeatures\u003e\n      \u003cdeviceboot/\u003e\n    \u003c/features\u003e\n  \u003c/guest\u003e\n\n  \u003cguest\u003e\n    \u003cos_type\u003ehvm\u003c/os_type\u003e\n    \u003carch name\u003d\u0027mipsel\u0027\u003e\n      \u003cwordsize\u003e32\u003c/wordsize\u003e\n      \u003cemulator\u003e/usr/bin/qemu-system-mipsel\u003c/emulator\u003e\n      \u003cmachine\u003emalta\u003c/machine\u003e\n      \u003cmachine\u003emipssim\u003c/machine\u003e\n      \u003cmachine\u003emagnum\u003c/machine\u003e\n      \u003cmachine\u003epica61\u003c/machine\u003e\n      \u003cmachine\u003emips\u003c/machine\u003e\n      \u003cdomain type\u003d\u0027qemu\u0027\u003e\n      \u003c/domain\u003e\n    \u003c/arch\u003e\n    \u003cfeatures\u003e\n      \u003cdeviceboot/\u003e\n    \u003c/features\u003e\n  \u003c/guest\u003e\n\n  \u003cguest\u003e\n    \u003cos_type\u003ehvm\u003c/os_type\u003e\n    \u003carch name\u003d\u0027sparc\u0027\u003e\n      \u003cwordsize\u003e32\u003c/wordsize\u003e\n      \u003cemulator\u003e/usr/bin/qemu-system-sparc\u003c/emulator\u003e\n      \u003cmachine\u003eSS-5\u003c/machine\u003e\n      \u003cmachine\u003eleon3_generic\u003c/machine\u003e\n      \u003cmachine\u003eSS-10\u003c/machine\u003e\n      \u003cmachine\u003eSS-600MP\u003c/machine\u003e\n      \u003cmachine\u003eSS-20\u003c/machine\u003e\n      \u003cmachine\u003eVoyager\u003c/machine\u003e\n      \u003cmachine\u003eLX\u003c/machine\u003e\n      \u003cmachine\u003eSS-4\u003c/machine\u003e\n      \u003cmachine\u003eSPARCClassic\u003c/machine\u003e\n      \u003cmachine\u003eSPARCbook\u003c/machine\u003e\n      \u003cmachine\u003eSS-1000\u003c/machine\u003e\n      \u003cmachine\u003eSS-2000\u003c/machine\u003e\n      \u003cmachine\u003eSS-2\u003c/machine\u003e\n      \u003cdomain type\u003d\u0027qemu\u0027\u003e\n      \u003c/domain\u003e\n    \u003c/arch\u003e\n  \u003c/guest\u003e\n\n  \u003cguest\u003e\n    \u003cos_type\u003ehvm\u003c/os_type\u003e\n    \u003carch name\u003d\u0027ppc\u0027\u003e\n      \u003cwordsize\u003e32\u003c/wordsize\u003e\n      \u003cemulator\u003e/usr/bin/qemu-system-ppc\u003c/emulator\u003e\n      \u003cmachine\u003eg3beige\u003c/machine\u003e\n      \u003cmachine\u003evirtex-ml507\u003c/machine\u003e\n      \u003cmachine\u003empc8544ds\u003c/machine\u003e\n      \u003cmachine canonical\u003d\u0027bamboo-0.13\u0027\u003ebamboo\u003c/machine\u003e\n      \u003cmachine\u003ebamboo-0.13\u003c/machine\u003e\n      \u003cmachine\u003ebamboo-0.12\u003c/machine\u003e\n      \u003cmachine\u003eref405ep\u003c/machine\u003e\n      \u003cmachine\u003etaihu\u003c/machine\u003e\n      \u003cmachine\u003emac99\u003c/machine\u003e\n      \u003cmachine\u003eprep\u003c/machine\u003e\n      \u003cdomain type\u003d\u0027qemu\u0027\u003e\n      \u003c/domain\u003e\n    \u003c/arch\u003e\n    \u003cfeatures\u003e\n      \u003cdeviceboot/\u003e\n    \u003c/features\u003e\n  \u003c/guest\u003e\n\n\u003c/capabilities\u003e\n2017-03-16 10:15:22,057 INFO [nova.wsgi] Stopping WSGI server.\n2017-03-16 10:15:22,057 INFO [nova.placement.wsgi.server] (3978) wsgi exited, is_accepting\u003dTrue\n2017-03-16 10:15:22,120 INFO [nova.wsgi] Stopping WSGI server.\n2017-03-16 10:15:22,120 INFO [nova.osapi_compute.wsgi.server] (3978) wsgi exited, is_accepting\u003dTrue\n2017-03-16 10:15:22,323 WARNING [nova.service] Service killed that has no database entry\n}}}\n\nstderr: {{{\n/home/jenkins/workspace/gate-nova-tox-functional-py35-ubuntu-xenial/.tox/functional-py35/lib/python3.5/site-packages/oslo_db/sqlalchemy/enginefacade.py:337: OsloDBDeprecationWarning: EngineFacade is deprecated; please use oslo_db.sqlalchemy.enginefacade\n  self._legacy_facade \u003d LegacyEngineFacade(None, _factory\u003dself)\n/home/jenkins/workspace/gate-nova-tox-functional-py35-ubuntu-xenial/nova/tests/fixtures.py:450: FutureWarning: The access_policy argument is changing its default value to \u003cclass \u0027oslo_messaging.rpc.dispatcher.DefaultRPCAccessPolicy\u0027\u003e in version \u0027?\u0027, please update the code to explicitly set None as the value: access_policy defaults to LegacyRPCAccessPolicy which exposes private methods. Explicitly set access_policy to DefaultRPCAccessPolicy or ExplicitRPCAccessPolicy.\n  serializer\u003dserializer)\n/home/jenkins/workspace/gate-nova-tox-functional-py35-ubuntu-xenial/.tox/functional-py35/lib/python3.5/site-packages/paste/deploy/loadwsgi.py:22: DeprecationWarning: Parameters to load are deprecated.  Call .resolve and .require separately.\n  return pkg_resources.EntryPoint.parse(\"x\u003d\" + s).load(False)\n/home/jenkins/workspace/gate-nova-tox-functional-py35-ubuntu-xenial/.tox/functional-py35/lib/python3.5/site-packages/oslo_middleware/cors.py:136: DeprecationWarning: Method \u0027CORS.set_latent()\u0027 has moved to \u0027method.set_defaults()\u0027: CORS.set_latent has been deprecated in favor of oslo_middleware.cors.set_defaults\n  allow_methods\u003dsanitize(self.conf.get(\u0027latent_allow_methods\u0027))\n/home/jenkins/workspace/gate-nova-tox-functional-py35-ubuntu-xenial/.tox/functional-py35/lib/python3.5/site-packages/oslo_middleware/base.py:128: DeprecationWarning: inspect.getargspec() is deprecated, use inspect.signature() instead\n  (args, varargs, varkw, defaults) \u003d getargspec(self.process_response)\n/home/jenkins/workspace/gate-nova-tox-functional-py35-ubuntu-xenial/.tox/functional-py35/lib/python3.5/site-packages/oslo_context/context.py:103: DeprecationWarning: Policy enforcement is depending on the value of is_admin. This key is deprecated. Please update your policy file to use the standard policy values.\n  DeprecationWarning)\n}}}\n\nTraceback (most recent call last):\n  File \"/home/jenkins/workspace/gate-nova-tox-functional-py35-ubuntu-xenial/nova/tests/functional/libvirt/test_numa_servers.py\", line 225, in test_create_server_with_hugepages\n    server \u003d self._run_build_test(flavor_id, filter_mock)\n  File \"/home/jenkins/workspace/gate-nova-tox-functional-py35-ubuntu-xenial/nova/tests/functional/libvirt/test_numa_servers.py\", line 72, in _run_build_test\n    self.compute \u003d self.start_service(\u0027compute\u0027, host\u003d\u0027test_compute0\u0027)\n  File \"/home/jenkins/workspace/gate-nova-tox-functional-py35-ubuntu-xenial/nova/test.py\", line 349, in start_service\n    nova_fixtures.ServiceFixture(name, host, **kwargs))\n  File \"/home/jenkins/workspace/gate-nova-tox-functional-py35-ubuntu-xenial/.tox/functional-py35/lib/python3.5/site-packages/testtools/testcase.py\", line 756, in useFixture\n    reraise(*exc_info)\n  File \"/home/jenkins/workspace/gate-nova-tox-functional-py35-ubuntu-xenial/.tox/functional-py35/lib/python3.5/site-packages/testtools/_compat3x.py\", line 16, in reraise\n    raise exc_obj.with_traceback(exc_tb)\n  File \"/home/jenkins/workspace/gate-nova-tox-functional-py35-ubuntu-xenial/.tox/functional-py35/lib/python3.5/site-packages/testtools/testcase.py\", line 731, in useFixture\n    fixture.setUp()\n  File \"/home/jenkins/workspace/gate-nova-tox-functional-py35-ubuntu-xenial/nova/tests/fixtures.py\", line 71, in setUp\n    self.service.start()\n  File \"/home/jenkins/workspace/gate-nova-tox-functional-py35-ubuntu-xenial/nova/service.py\", line 144, in start\n    self.manager.init_host()\n  File \"/home/jenkins/workspace/gate-nova-tox-functional-py35-ubuntu-xenial/nova/compute/manager.py\", line 1135, in init_host\n    self.driver.init_host(host\u003dself.host)\n  File \"/home/jenkins/workspace/gate-nova-tox-functional-py35-ubuntu-xenial/nova/virt/libvirt/driver.py\", line 469, in init_host\n    self._do_quality_warnings()\n  File \"/home/jenkins/workspace/gate-nova-tox-functional-py35-ubuntu-xenial/nova/virt/libvirt/driver.py\", line 446, in _do_quality_warnings\n    caps \u003d self._host.get_capabilities()\n  File \"/home/jenkins/workspace/gate-nova-tox-functional-py35-ubuntu-xenial/nova/virt/libvirt/host.py\", line 642, in get_capabilities\n    self._caps.parse_str(xmlstr)\n  File \"/home/jenkins/workspace/gate-nova-tox-functional-py35-ubuntu-xenial/nova/virt/libvirt/config.py\", line 68, in parse_str\n    self.parse_dom(etree.fromstring(xmlstr))\n  File \"/home/jenkins/workspace/gate-nova-tox-functional-py35-ubuntu-xenial/nova/virt/libvirt/config.py\", line 98, in parse_dom\n    host.parse_dom(c)\n  File \"/home/jenkins/workspace/gate-nova-tox-functional-py35-ubuntu-xenial/nova/virt/libvirt/config.py\", line 283, in parse_dom\n    self.topology.parse_dom(c)\n  File \"/home/jenkins/workspace/gate-nova-tox-functional-py35-ubuntu-xenial/nova/virt/libvirt/config.py\", line 131, in parse_dom\n    cell.parse_dom(xmlcell)\n  File \"/home/jenkins/workspace/gate-nova-tox-functional-py35-ubuntu-xenial/nova/virt/libvirt/config.py\", line 167, in parse_dom\n    pages.parse_dom(c)\n  File \"/home/jenkins/workspace/gate-nova-tox-functional-py35-ubuntu-xenial/nova/virt/libvirt/config.py\", line 249, in parse_dom\n    self.total \u003d int(xmldoc.text)\nValueError: invalid literal for int() with base 10: \u00273670016.0\u0027","commit_id":"e8d4672cb6bc8c22d184b3ee32720bf5d9a53c70"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"dbef7e9dec9300acdc5038e65e286f1b893c5a85","unresolved":false,"context_lines":[{"line_number":192,"context_line":"        \"\"\"Validate that servers with huge pages have a NUMA topology."},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"        Configuring huge pages against a server also necessitates configuring a"},{"line_number":195,"context_line":"        NUMA topology."},{"line_number":196,"context_line":"        \"\"\""},{"line_number":197,"context_line":"        host_info \u003d fakelibvirt.NUMAHostInfo(cpu_nodes\u003d1, cpu_sockets\u003d2,"},{"line_number":198,"context_line":"                                             cpu_cores\u003d2, cpu_threads\u003d2,"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a1ced50_a20a671f","line":195,"updated":"2017-03-20 19:13:09.000000000","message":"Why exactly is this the case again? Why can\u0027t I set up hugepage support on a host with only a single NUMA node?","commit_id":"c741a04cec63260db5594a439af72ef8a8f99b70"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9a13f0e00153015bd3108e086d7d6147ca254820","unresolved":false,"context_lines":[{"line_number":192,"context_line":"        \"\"\"Validate that servers with huge pages have a NUMA topology."},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"        Configuring huge pages against a server also necessitates configuring a"},{"line_number":195,"context_line":"        NUMA topology."},{"line_number":196,"context_line":"        \"\"\""},{"line_number":197,"context_line":"        host_info \u003d fakelibvirt.NUMAHostInfo(cpu_nodes\u003d1, cpu_sockets\u003d2,"},{"line_number":198,"context_line":"                                             cpu_cores\u003d2, cpu_threads\u003d2,"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a1ced50_620a187b","line":195,"in_reply_to":"1a1ced50_a20a671f","updated":"2017-03-21 09:15:56.000000000","message":"Yeah, this isn\u0027t exactly true. You can do it with a single NUMA node alright and you can also do it with no NUMA topology (which I assume is what you meant). I guess we could add a second test for this case but I\u0027m not sure how valuable that would be?","commit_id":"c741a04cec63260db5594a439af72ef8a8f99b70"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"069af9e2caaed4fcb207e272b37c935477b4cb3b","unresolved":false,"context_lines":[{"line_number":208,"context_line":""},{"line_number":209,"context_line":"        # Create a flavor"},{"line_number":210,"context_line":"        extra_spec \u003d {"},{"line_number":211,"context_line":"             # \u0027large\u0027 is an alias for 2MB huge page size"},{"line_number":212,"context_line":"            \u0027hw:mem_page_size\u0027: \u0027large\u0027,"},{"line_number":213,"context_line":"        }"},{"line_number":214,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"3f1d235d_ec4bc1ad","line":211,"range":{"start_line":211,"start_character":13,"end_line":211,"end_character":57},"updated":"2017-06-29 14:32:36.000000000","message":"that is incorrect large is a sentenial for any hugepage size e.g. anything other then 4k pages","commit_id":"5e3c3f84f523d0ffb262feac9ca6d718c0a988d3"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"a763635537d1f5188272413b9f8acc22352bd3df","unresolved":false,"context_lines":[{"line_number":215,"context_line":"        flavor_id \u003d self._create_flavor(memory_mb\u003d2048, vcpu\u003d4,"},{"line_number":216,"context_line":"                                        extra_spec\u003dextra_spec)"},{"line_number":217,"context_line":"        host_pass_mock \u003d self._get_topology_filter_spy()"},{"line_number":218,"context_line":"        with test.nested("},{"line_number":219,"context_line":"            mock.patch(\u0027nova.virt.libvirt.host.Host.get_connection\u0027,"},{"line_number":220,"context_line":"                       return_value\u003dfake_connection),"},{"line_number":221,"context_line":"            mock.patch(\u0027nova.scheduler.filters\u0027"},{"line_number":222,"context_line":"                       \u0027.numa_topology_filter.NUMATopologyFilter.host_passes\u0027,"},{"line_number":223,"context_line":"                       side_effect\u003dhost_pass_mock)) as (conn_mock,"},{"line_number":224,"context_line":"                                                        filter_mock):"},{"line_number":225,"context_line":"            server \u003d self._run_build_test(flavor_id, filter_mock)"},{"line_number":226,"context_line":"            ctx \u003d nova_context.get_admin_context()"},{"line_number":227,"context_line":"            inst \u003d objects.Instance.get_by_uuid(ctx, server[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f1d235d_ac502934","line":224,"range":{"start_line":218,"start_character":8,"end_line":224,"end_character":69},"updated":"2017-06-29 14:36:07.000000000","message":"with nested should not be used for new tests. it is not python 3 compatible without a workaround the decorator syntax should be used instead as tend to be shorter and also works in both python2 and 3 without needing to use six to redifine nested on python 3","commit_id":"5e3c3f84f523d0ffb262feac9ca6d718c0a988d3"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"fb97e399f4d8d045874c58608df6d3c4f56ab13c","unresolved":false,"context_lines":[{"line_number":556,"context_line":"        cells \u003d inst.numa_topology.cells"},{"line_number":557,"context_line":"        self.assertEqual(1, len(cells))"},{"line_number":558,"context_line":"        self.assertEqual(2048, cells[0].pagesize)  # kB"},{"line_number":559,"context_line":"        self.assertEqual(2048, cells[0].memory)  # MB"}],"source_content_type":"text/x-python","patch_set":16,"id":"3f79a3b5_5a5ff574","line":559,"updated":"2018-08-28 14:23:48.000000000","message":"Can you also validate the new huge pages resources reported by the host? It\u0027s important to valid such information for scheduling purpose.","commit_id":"ca4f7614c553b0ac9f790c122bd51f4147552e49"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"c162441bf133c06b6a4f252f0b850a67e9e91292","unresolved":false,"context_lines":[{"line_number":556,"context_line":"        cells \u003d inst.numa_topology.cells"},{"line_number":557,"context_line":"        self.assertEqual(1, len(cells))"},{"line_number":558,"context_line":"        self.assertEqual(2048, cells[0].pagesize)  # kB"},{"line_number":559,"context_line":"        self.assertEqual(2048, cells[0].memory)  # MB"}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa7e38b_ec7866c3","line":559,"in_reply_to":"3f79a3b5_10194721","updated":"2020-01-31 16:30:45.000000000","message":"I declined to do this, instead opting to add a negative test. This tests this implicitly as if our libvirt mocks weren\u0027t getting translated correctly, either everything would pass or nothing would pass","commit_id":"ca4f7614c553b0ac9f790c122bd51f4147552e49"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"710dd2e0626769ca6e3a84351f697de2b15bf197","unresolved":false,"context_lines":[{"line_number":556,"context_line":"        cells \u003d inst.numa_topology.cells"},{"line_number":557,"context_line":"        self.assertEqual(1, len(cells))"},{"line_number":558,"context_line":"        self.assertEqual(2048, cells[0].pagesize)  # kB"},{"line_number":559,"context_line":"        self.assertEqual(2048, cells[0].memory)  # MB"}],"source_content_type":"text/x-python","patch_set":16,"id":"3f79a3b5_6ecf93b3","line":559,"in_reply_to":"3f79a3b5_5a5ff574","updated":"2018-08-28 16:37:17.000000000","message":"You mean like reading sysfs? I don\u0027t think so as that would break the boundary of a \"functional\" test. If we want to do this, it would have to be done in an integration (tempest) test.","commit_id":"ca4f7614c553b0ac9f790c122bd51f4147552e49"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"082492136227e6cc4ec8e826f5597943b3821590","unresolved":false,"context_lines":[{"line_number":556,"context_line":"        cells \u003d inst.numa_topology.cells"},{"line_number":557,"context_line":"        self.assertEqual(1, len(cells))"},{"line_number":558,"context_line":"        self.assertEqual(2048, cells[0].pagesize)  # kB"},{"line_number":559,"context_line":"        self.assertEqual(2048, cells[0].memory)  # MB"}],"source_content_type":"text/x-python","patch_set":16,"id":"3f79a3b5_eeae432e","line":559,"in_reply_to":"3f79a3b5_6ecf93b3","updated":"2018-08-28 17:05:07.000000000","message":"i think he ment check the host_info object and assert that the mempages were decremented by the amount requested by the vm\n\nnot just check the  instance numa topology.","commit_id":"ca4f7614c553b0ac9f790c122bd51f4147552e49"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"02d19fcbdc1b29aef7405fa4abd4464b63908f8d","unresolved":false,"context_lines":[{"line_number":556,"context_line":"        cells \u003d inst.numa_topology.cells"},{"line_number":557,"context_line":"        self.assertEqual(1, len(cells))"},{"line_number":558,"context_line":"        self.assertEqual(2048, cells[0].pagesize)  # kB"},{"line_number":559,"context_line":"        self.assertEqual(2048, cells[0].memory)  # MB"}],"source_content_type":"text/x-python","patch_set":16,"id":"3f79a3b5_10194721","line":559,"in_reply_to":"3f79a3b5_eeae432e","updated":"2018-08-29 11:58:19.000000000","message":"Yes exactly. Thanks details added Sean :-)","commit_id":"ca4f7614c553b0ac9f790c122bd51f4147552e49"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"125e61460cbb3979ce57abd0b340a56574860f79","unresolved":false,"context_lines":[{"line_number":156,"context_line":"        # small pages"},{"line_number":157,"context_line":"        for cell in host_info.numa_topology.cells:"},{"line_number":158,"context_line":"            huge_pages \u003d 1024"},{"line_number":159,"context_line":"            small_pages \u003d (host_info.kB_mem - (2048 * huge_pages)) // 4"},{"line_number":160,"context_line":"            cell.mempages \u003d fakelibvirt.create_mempages(["},{"line_number":161,"context_line":"                (4, small_pages),"},{"line_number":162,"context_line":"                (2048, huge_pages),"}],"source_content_type":"text/x-python","patch_set":18,"id":"3fa7e38b_87a2ebfa","line":159,"range":{"start_line":159,"start_character":27,"end_line":159,"end_character":43},"updated":"2020-01-31 16:45:56.000000000","message":"one thing that comes to mind is in placmenet currently we use this valude when reporting memory_mb  after converting it to mb and its also what we report in the hypervior api. e.g. the totall amount of memory not the free memory.\n\nwe will have to consider what to show in the hyperviors api wehn we move memory under numa nodes in placemnt.\n\nwe could still consideer reporting all memroy in the hypervior api  or expose the diffent sets of memroy per page size. i suspect we will want to direct people to query placmeent directly instead of they want the lower level view instead  of proxying it.","commit_id":"ce1f4804801b7878bad5c0d4abffede975530022"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"388eac7ce6c9f60ef2aced6b96da026bc00be364","unresolved":false,"context_lines":[{"line_number":162,"context_line":"                (2048, huge_pages),"},{"line_number":163,"context_line":"            ])"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        extra_spec \u003d {\u0027hw:mem_page_size\u0027: \u0027large\u0027}"},{"line_number":166,"context_line":"        flavor_id \u003d self._create_flavor(extra_spec\u003dextra_spec)"},{"line_number":167,"context_line":"        expected_usage \u003d {\u0027DISK_GB\u0027: 20, \u0027MEMORY_MB\u0027: 2048, \u0027VCPU\u0027: 2}"},{"line_number":168,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"3fa7e38b_c79ea367","line":165,"range":{"start_line":165,"start_character":8,"end_line":165,"end_character":50},"updated":"2020-01-31 17:05:03.000000000","message":"while i think about it it woudl be nice to also test hw:mem_page_size\u003dsmall\n\ni wonder if we coudl test multipel cobination with ddt in a follow up.\n\ni think the inputs we would need are \n(host_largepage_size, small_page_cout, lage_page_count, ,guest_pageszie, guest_ram, end_status)\n\nfor example (2048,256,2048,large,2048, ACTIVE)\nthat would test host with 4G of 2mb hugepages and 1G of 4k pages, and assert we can boot a vm with 2G of hugepages.\n\n(2048,256,2048,small,1024,\u0027ERROR\u0027)\nthis would assert that on the same host confiugration we could not boot a vm with small pages as 2G is \u003e then the 1G available\n\nif we did it that way we shoudl be able to test a resonably amount to configuration without adding lots of code duplication in the tests.\n\nthat is something we can think about later in a follow up patch.","commit_id":"ce1f4804801b7878bad5c0d4abffede975530022"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"7989f2aa82098800da257394794309c757a8daf9","unresolved":false,"context_lines":[{"line_number":163,"context_line":"            ])"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        extra_spec \u003d {\u0027hw:mem_page_size\u0027: \u0027large\u0027}"},{"line_number":166,"context_line":"        flavor_id \u003d self._create_flavor(extra_spec\u003dextra_spec)"},{"line_number":167,"context_line":"        expected_usage \u003d {\u0027DISK_GB\u0027: 20, \u0027MEMORY_MB\u0027: 2048, \u0027VCPU\u0027: 2}"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"        server \u003d self._run_build_test(flavor_id, expected_usage\u003dexpected_usage)"}],"source_content_type":"text/x-python","patch_set":18,"id":"3fa7e38b_a7828701","line":166,"updated":"2020-01-31 17:04:58.000000000","message":"I guess my point on L200 applies here too, but it\u0027s less bad here because:\n\n1. We have the expected_usage immediately after\n2. We expect the test to succeed, so there\u0027s less of a \"wait, why is this supposed to not fit again?\" reaction.","commit_id":"ce1f4804801b7878bad5c0d4abffede975530022"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"125e61460cbb3979ce57abd0b340a56574860f79","unresolved":false,"context_lines":[{"line_number":173,"context_line":"        self.assertEqual(1, len(inst.numa_topology.cells))"},{"line_number":174,"context_line":"        self.assertEqual(2048, inst.numa_topology.cells[0].pagesize)  # kB"},{"line_number":175,"context_line":"        self.assertEqual(2048, inst.numa_topology.cells[0].memory)  # MB"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    def test_create_server_with_hugepages_fails(self):"},{"line_number":178,"context_line":"        \"\"\"Create a server with huge pages on a host that doesn\u0027t support them."},{"line_number":179,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"3fa7e38b_478dd37b","line":176,"updated":"2020-01-31 16:45:56.000000000","message":"we could also make some assertion about the toplogy of the plamcent inventories reported although i guess for now that wont add much.\n\ni dont think the insnace numa toplogy blob will be change with the placmenet change but i do suspec we will be able to remove all the mempage infor form the host numa toplogy blob\nat least in the db and instead just calculate that directly form libvirt and store it in placment.","commit_id":"ce1f4804801b7878bad5c0d4abffede975530022"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"775e66643d453433e2c6724e8f1a8da02468561d","unresolved":false,"context_lines":[{"line_number":173,"context_line":"        self.assertEqual(1, len(inst.numa_topology.cells))"},{"line_number":174,"context_line":"        self.assertEqual(2048, inst.numa_topology.cells[0].pagesize)  # kB"},{"line_number":175,"context_line":"        self.assertEqual(2048, inst.numa_topology.cells[0].memory)  # MB"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    def test_create_server_with_hugepages_fails(self):"},{"line_number":178,"context_line":"        \"\"\"Create a server with huge pages on a host that doesn\u0027t support them."},{"line_number":179,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"3fa7e38b_a7236712","line":176,"in_reply_to":"3fa7e38b_478dd37b","updated":"2020-01-31 17:28:08.000000000","message":"Yeah, this doesn\u0027t matter for now since we don\u0027t have NUMA or mempages in placement. When we do, I expect the expected_usage above to stay the same but it will be coming from different resource providers so we\u0027ll have to handle that.","commit_id":"ce1f4804801b7878bad5c0d4abffede975530022"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"667d38dcce895c67808fda189769ab4e908c5914","unresolved":false,"context_lines":[{"line_number":195,"context_line":"            ])"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"        extra_spec \u003d {\u0027hw:mem_page_size\u0027: \u0027large\u0027}"},{"line_number":198,"context_line":"        flavor_id \u003d self._create_flavor(extra_spec\u003dextra_spec)"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"        self._run_build_test(flavor_id, end_status\u003d\u0027ERROR\u0027)"},{"line_number":201,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"3fa7e38b_87daeb47","line":198,"updated":"2020-01-31 17:00:45.000000000","message":"We\u0027re counting on the default memory_mb\u003d2048 kwarg to _create_flavor, which I guess is fine, but is kinda opaque? Maybe a note? Or just spell it out explicitly, even if it\u0027s not necessary, just to be obvious?","commit_id":"ce1f4804801b7878bad5c0d4abffede975530022"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b6a37d61b75a3d44034364626deaf41b92d4ee44","unresolved":false,"context_lines":[{"line_number":195,"context_line":"            ])"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"        extra_spec \u003d {\u0027hw:mem_page_size\u0027: \u0027large\u0027}"},{"line_number":198,"context_line":"        flavor_id \u003d self._create_flavor(extra_spec\u003dextra_spec)"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"        self._run_build_test(flavor_id, end_status\u003d\u0027ERROR\u0027)"},{"line_number":201,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"3fa7e38b_c78c632f","line":198,"in_reply_to":"3fa7e38b_87daeb47","updated":"2020-01-31 17:08:21.000000000","message":"ya i think that would help make it more clear","commit_id":"ce1f4804801b7878bad5c0d4abffede975530022"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"775e66643d453433e2c6724e8f1a8da02468561d","unresolved":false,"context_lines":[{"line_number":195,"context_line":"            ])"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"        extra_spec \u003d {\u0027hw:mem_page_size\u0027: \u0027large\u0027}"},{"line_number":198,"context_line":"        flavor_id \u003d self._create_flavor(extra_spec\u003dextra_spec)"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"        self._run_build_test(flavor_id, end_status\u003d\u0027ERROR\u0027)"},{"line_number":201,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"3fa7e38b_e7dcffe3","line":198,"in_reply_to":"3fa7e38b_c78c632f","updated":"2020-01-31 17:28:08.000000000","message":"Good idea. Done","commit_id":"ce1f4804801b7878bad5c0d4abffede975530022"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"667d38dcce895c67808fda189769ab4e908c5914","unresolved":false,"context_lines":[{"line_number":197,"context_line":"        extra_spec \u003d {\u0027hw:mem_page_size\u0027: \u0027large\u0027}"},{"line_number":198,"context_line":"        flavor_id \u003d self._create_flavor(extra_spec\u003dextra_spec)"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"        self._run_build_test(flavor_id, end_status\u003d\u0027ERROR\u0027)"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"    def test_create_server_with_legacy_pinning_policy(self):"},{"line_number":203,"context_line":"        \"\"\"Create a server using the legacy \u0027hw:cpu_policy\u0027 extra spec."}],"source_content_type":"text/x-python","patch_set":18,"id":"3fa7e38b_870c2bec","line":200,"updated":"2020-01-31 17:00:45.000000000","message":"I\u0027d feel better about false negatives if we asserted the specific error message in the logs, sorta like what I do in [1].\n\n[1] https://review.opendev.org/#/c/672595/64/nova/tests/functional/libvirt/test_numa_live_migration.py@540","commit_id":"ce1f4804801b7878bad5c0d4abffede975530022"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b6a37d61b75a3d44034364626deaf41b92d4ee44","unresolved":false,"context_lines":[{"line_number":197,"context_line":"        extra_spec \u003d {\u0027hw:mem_page_size\u0027: \u0027large\u0027}"},{"line_number":198,"context_line":"        flavor_id \u003d self._create_flavor(extra_spec\u003dextra_spec)"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"        self._run_build_test(flavor_id, end_status\u003d\u0027ERROR\u0027)"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"    def test_create_server_with_legacy_pinning_policy(self):"},{"line_number":203,"context_line":"        \"\"\"Create a server using the legacy \u0027hw:cpu_policy\u0027 extra spec."}],"source_content_type":"text/x-python","patch_set":18,"id":"3fa7e38b_47987366","line":200,"in_reply_to":"3fa7e38b_27c8d774","updated":"2020-01-31 17:08:21.000000000","message":"well we would normally assert that we got a no valid host error form the api.\n\nwe could look at the logs i guess too.","commit_id":"ce1f4804801b7878bad5c0d4abffede975530022"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"d36896e74ec30d8186e8d1452d31248e49c8a45a","unresolved":false,"context_lines":[{"line_number":197,"context_line":"        extra_spec \u003d {\u0027hw:mem_page_size\u0027: \u0027large\u0027}"},{"line_number":198,"context_line":"        flavor_id \u003d self._create_flavor(extra_spec\u003dextra_spec)"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"        self._run_build_test(flavor_id, end_status\u003d\u0027ERROR\u0027)"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"    def test_create_server_with_legacy_pinning_policy(self):"},{"line_number":203,"context_line":"        \"\"\"Create a server using the legacy \u0027hw:cpu_policy\u0027 extra spec."}],"source_content_type":"text/x-python","patch_set":18,"id":"3fa7e38b_47c63344","line":200,"in_reply_to":"3fa7e38b_47987366","updated":"2020-01-31 17:10:44.000000000","message":"One or the other, I don\u0027t really care - the point is, I don\u0027t thinks saying \"whelp, server\u0027s in ERROR, we\u0027re done here\" is enough.","commit_id":"ce1f4804801b7878bad5c0d4abffede975530022"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"775e66643d453433e2c6724e8f1a8da02468561d","unresolved":false,"context_lines":[{"line_number":197,"context_line":"        extra_spec \u003d {\u0027hw:mem_page_size\u0027: \u0027large\u0027}"},{"line_number":198,"context_line":"        flavor_id \u003d self._create_flavor(extra_spec\u003dextra_spec)"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"        self._run_build_test(flavor_id, end_status\u003d\u0027ERROR\u0027)"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"    def test_create_server_with_legacy_pinning_policy(self):"},{"line_number":203,"context_line":"        \"\"\"Create a server using the legacy \u0027hw:cpu_policy\u0027 extra spec."}],"source_content_type":"text/x-python","patch_set":18,"id":"3fa7e38b_87ce6b2a","line":200,"in_reply_to":"3fa7e38b_47c63344","updated":"2020-01-31 17:28:08.000000000","message":"That\u0027s all I can get though, unfortunately. Scheduling will fail at the NUMATopologyFilter layer because it can\u0027t fit on any host, so the best I can do is start mocking debug level logs which isn\u0027t something we should be doing from functional tests. We do check that the NUMA topology filter is being called though, so there\u0027s that?","commit_id":"ce1f4804801b7878bad5c0d4abffede975530022"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"601b3b0ca9a442873a094ba6fd2b5602342379d9","unresolved":false,"context_lines":[{"line_number":197,"context_line":"        extra_spec \u003d {\u0027hw:mem_page_size\u0027: \u0027large\u0027}"},{"line_number":198,"context_line":"        flavor_id \u003d self._create_flavor(extra_spec\u003dextra_spec)"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"        self._run_build_test(flavor_id, end_status\u003d\u0027ERROR\u0027)"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"    def test_create_server_with_legacy_pinning_policy(self):"},{"line_number":203,"context_line":"        \"\"\"Create a server using the legacy \u0027hw:cpu_policy\u0027 extra spec."}],"source_content_type":"text/x-python","patch_set":18,"id":"3fa7e38b_27c8d774","line":200,"in_reply_to":"3fa7e38b_870c2bec","updated":"2020-01-31 17:02:30.000000000","message":"False positives, I should say, since the server could be in ERROR for any number of reasons.","commit_id":"ce1f4804801b7878bad5c0d4abffede975530022"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"f76bc1c85d73ee2873399309be81020e9613172e","unresolved":false,"context_lines":[{"line_number":197,"context_line":"        extra_spec \u003d {\u0027hw:mem_page_size\u0027: \u0027large\u0027}"},{"line_number":198,"context_line":"        flavor_id \u003d self._create_flavor(extra_spec\u003dextra_spec)"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"        self._run_build_test(flavor_id, end_status\u003d\u0027ERROR\u0027)"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"    def test_create_server_with_legacy_pinning_policy(self):"},{"line_number":203,"context_line":"        \"\"\"Create a server using the legacy \u0027hw:cpu_policy\u0027 extra spec."}],"source_content_type":"text/x-python","patch_set":18,"id":"3fa7e38b_a220359f","line":200,"in_reply_to":"3fa7e38b_87ce6b2a","updated":"2020-01-31 17:44:02.000000000","message":"Ah, because my thing (see [1] above) is an actual exception that\u0027s logged, but here they\u0027d be debug-level logs. Yeah, I guess there\u0027s not much we can do.","commit_id":"ce1f4804801b7878bad5c0d4abffede975530022"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"353e0a5d00721bfa97f733541010f44d14eda012","unresolved":false,"context_lines":[{"line_number":157,"context_line":"        for cell in host_info.numa_topology.cells:"},{"line_number":158,"context_line":"            huge_pages \u003d 1024"},{"line_number":159,"context_line":"            small_pages \u003d (host_info.kB_mem - (2048 * huge_pages)) // 4"},{"line_number":160,"context_line":"            cell.mempages \u003d fakelibvirt.create_mempages(["},{"line_number":161,"context_line":"                (4, small_pages),"},{"line_number":162,"context_line":"                (2048, huge_pages),"},{"line_number":163,"context_line":"            ])"}],"source_content_type":"text/x-python","patch_set":19,"id":"3fa7e38b_cc4d473d","line":160,"range":{"start_line":160,"start_character":12,"end_line":160,"end_character":25},"updated":"2020-02-04 09:50:02.000000000","message":"Changing host_info after passed to the connection feels dangerous to me.","commit_id":"5c048345a5b84f047ee71616937033503d1b4358"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"f76bc1c85d73ee2873399309be81020e9613172e","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        server \u003d self._run_build_test(flavor_id, expected_usage\u003dexpected_usage)"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"        ctx \u003d nova_context.get_admin_context()"},{"line_number":172,"context_line":"        inst \u003d objects.Instance.get_by_uuid(ctx, server[\u0027id\u0027])"},{"line_number":173,"context_line":"        self.assertEqual(1, len(inst.numa_topology.cells))"},{"line_number":174,"context_line":"        self.assertEqual(2048, inst.numa_topology.cells[0].pagesize)  # kB"},{"line_number":175,"context_line":"        self.assertEqual(2048, inst.numa_topology.cells[0].memory)  # MB"}],"source_content_type":"text/x-python","patch_set":19,"id":"3fa7e38b_826df9cc","line":172,"updated":"2020-01-31 17:44:02.000000000","message":"nit: why not pull out the numa_topology directly with instance_numa.NUMATopology.get_by_instance_uuid() ?","commit_id":"5c048345a5b84f047ee71616937033503d1b4358"}]}
