)]}'
{"nova/test.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"43fd80761bb7c93c8bfa13660ae3b36b5c102d7c","unresolved":false,"context_lines":[{"line_number":73,"context_line":"CONF.set_override(\u0027use_stderr\u0027, False)"},{"line_number":74,"context_line":"logging.setup(CONF, \u0027nova\u0027)"},{"line_number":75,"context_line":"cache.configure(CONF)"},{"line_number":76,"context_line":"neutron_conf.register_dynamic_opts(CONF)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"_TRUE_VALUES \u003d (\u0027True\u0027, \u0027true\u0027, \u00271\u0027, \u0027yes\u0027)"},{"line_number":79,"context_line":"CELL1_NAME \u003d \u0027cell1\u0027"}],"source_content_type":"text/x-python","patch_set":24,"id":"5f7c97a3_24424ead","line":76,"range":{"start_line":76,"start_character":0,"end_line":76,"end_character":40},"updated":"2018-07-19 16:43:08.000000000","message":"We should probably register this in the ConfFixture where this would be a more natural fit.","commit_id":"843aff2e602d13d9cc5d72e76e81499e9f8b8ce5"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bed8181a0e0107adb53a3578caed7e06f700d656","unresolved":false,"context_lines":[{"line_number":73,"context_line":"CONF.set_override(\u0027use_stderr\u0027, False)"},{"line_number":74,"context_line":"logging.setup(CONF, \u0027nova\u0027)"},{"line_number":75,"context_line":"cache.configure(CONF)"},{"line_number":76,"context_line":"neutron_conf.register_dynamic_opts(CONF)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"_TRUE_VALUES \u003d (\u0027True\u0027, \u0027true\u0027, \u00271\u0027, \u0027yes\u0027)"},{"line_number":79,"context_line":"CELL1_NAME \u003d \u0027cell1\u0027"}],"source_content_type":"text/x-python","patch_set":24,"id":"5f7c97a3_8f3a5b94","line":76,"range":{"start_line":76,"start_character":0,"end_line":76,"end_character":40},"in_reply_to":"5f7c97a3_24424ead","updated":"2018-07-19 16:53:17.000000000","message":"Ack","commit_id":"843aff2e602d13d9cc5d72e76e81499e9f8b8ce5"}],"nova/tests/unit/conf_fixture.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1317b995c2cd0985ab2d07f50f7cd120282c510e","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        config.parse_args([], default_config_files\u003d[], configure_db\u003dFalse,"},{"line_number":81,"context_line":"                          init_rpc\u003dFalse)"},{"line_number":82,"context_line":"        policy_opts.set_defaults(self.conf)"},{"line_number":83,"context_line":"        neutron.register_dynamic_opts(self.conf)"},{"line_number":84,"context_line":"        self.addCleanup(utils.cleanup_dns_managers)"},{"line_number":85,"context_line":"        self.addCleanup(ipv6.api.reset_backend)"}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_ff3e06b4","line":83,"updated":"2018-07-20 14:50:21.000000000","message":"So do we really need this because it seems every time the config is set you have to reload it.","commit_id":"dd04e73f3f117b592fb18080f6ff77ac7f613da2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ca1832c509d8a3a235ffe6887da6d5406c33a8bb","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        config.parse_args([], default_config_files\u003d[], configure_db\u003dFalse,"},{"line_number":81,"context_line":"                          init_rpc\u003dFalse)"},{"line_number":82,"context_line":"        policy_opts.set_defaults(self.conf)"},{"line_number":83,"context_line":"        neutron.register_dynamic_opts(self.conf)"},{"line_number":84,"context_line":"        self.addCleanup(utils.cleanup_dns_managers)"},{"line_number":85,"context_line":"        self.addCleanup(ipv6.api.reset_backend)"}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_bf1acdc3","line":83,"in_reply_to":"5f7c97a3_1f6ae219","updated":"2018-07-20 15:38:42.000000000","message":"OK, but it doesn\u0027t seem we need it since every test that sets the values loaded here have to reload them anyway, but maybe I\u0027m missing something (I haven\u0027t pulled this down to remove it and see what breaks). Still, we should update the flags() method to always reload these options if we\u0027re setting them (since apparently they are tightly coupled that way).","commit_id":"dd04e73f3f117b592fb18080f6ff77ac7f613da2"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e7df36d8a28e40a0a6a23a82a3e74342b4cf67fd","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        config.parse_args([], default_config_files\u003d[], configure_db\u003dFalse,"},{"line_number":81,"context_line":"                          init_rpc\u003dFalse)"},{"line_number":82,"context_line":"        policy_opts.set_defaults(self.conf)"},{"line_number":83,"context_line":"        neutron.register_dynamic_opts(self.conf)"},{"line_number":84,"context_line":"        self.addCleanup(utils.cleanup_dns_managers)"},{"line_number":85,"context_line":"        self.addCleanup(ipv6.api.reset_backend)"}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_1f6ae219","line":83,"in_reply_to":"5f7c97a3_ff3e06b4","updated":"2018-07-20 15:14:51.000000000","message":"I think this comes from an earlier rev (see comments on PS6) where we weren\u0027t doing this and other nefarity was employed in its stead.","commit_id":"dd04e73f3f117b592fb18080f6ff77ac7f613da2"}],"nova/tests/unit/virt/libvirt/test_driver.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"785d4cb4aa79b8ebbd03ad5178c06f6f0cf6a4b2","unresolved":false,"context_lines":[{"line_number":14659,"context_line":"                if key not in [\u0027phys_function\u0027, \u0027virt_functions\u0027, \u0027label\u0027]:"},{"line_number":14660,"context_line":"                    self.assertEqual(expectvfs[dev][key], actualvfs[dev][key])"},{"line_number":14661,"context_line":""},{"line_number":14662,"context_line":"    # TODO(stephenfin): This only has one caller. Flatten it and remove the"},{"line_number":14663,"context_line":"    # \u0027mempages\u003dFalse\u0027 branches"},{"line_number":14664,"context_line":"    def _test_get_host_numa_topology(self, mempages):"},{"line_number":14665,"context_line":"        self.flags(physnets\u003d[\u0027foo\u0027, \u0027bar\u0027], group\u003d\u0027neutron\u0027)"},{"line_number":14666,"context_line":"        config._register_neutron_numa_opts()"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f6a8fd7_c4f53185","line":14663,"range":{"start_line":14662,"start_character":4,"end_line":14663,"end_character":31},"updated":"2018-04-30 10:11:54.000000000","message":"nit: that kind of implies we are missing tests...\n\nyou can certainly have numa topology without hugepages.\n\nperhaps change this to a NOTE that testing could be improved here and maybe open a low hanging fruit bug for it. that said the area of code it is testing is non trival but its just adding unit tests so i think low hanging fruit would still apply.","commit_id":"deabe64b9a0f33ce2dd6e1f752c2a569f2030cf0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"c6dd909d2f926c4e9ce2807da55cde77ea414134","unresolved":false,"context_lines":[{"line_number":14659,"context_line":"                if key not in [\u0027phys_function\u0027, \u0027virt_functions\u0027, \u0027label\u0027]:"},{"line_number":14660,"context_line":"                    self.assertEqual(expectvfs[dev][key], actualvfs[dev][key])"},{"line_number":14661,"context_line":""},{"line_number":14662,"context_line":"    # TODO(stephenfin): This only has one caller. Flatten it and remove the"},{"line_number":14663,"context_line":"    # \u0027mempages\u003dFalse\u0027 branches"},{"line_number":14664,"context_line":"    def _test_get_host_numa_topology(self, mempages):"},{"line_number":14665,"context_line":"        self.flags(physnets\u003d[\u0027foo\u0027, \u0027bar\u0027], group\u003d\u0027neutron\u0027)"},{"line_number":14666,"context_line":"        config._register_neutron_numa_opts()"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_3c2e8343","line":14663,"range":{"start_line":14662,"start_character":4,"end_line":14663,"end_character":31},"in_reply_to":"9f6a8fd7_c4f53185","updated":"2018-05-07 13:43:11.000000000","message":"Done","commit_id":"deabe64b9a0f33ce2dd6e1f752c2a569f2030cf0"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"482bbce5c327095cb8925591f71808eb86bf616a","unresolved":false,"context_lines":[{"line_number":14738,"context_line":"            self.assertFalse(got_topo.cells[1].networks.tunnel)"},{"line_number":14739,"context_line":"            self.assertTrue(got_topo.cells[2].networks.tunnel)"},{"line_number":14740,"context_line":"            self.assertFalse(got_topo.cells[3].networks.tunnel)"},{"line_number":14741,"context_line":""},{"line_number":14742,"context_line":"    @mock.patch.object(host.Host, \u0027has_min_version\u0027, return_value\u003dTrue)"},{"line_number":14743,"context_line":"    def test_get_host_numa_topology(self, mock_version):"},{"line_number":14744,"context_line":"        self._test_get_host_numa_topology(mempages\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f6a8fd7_4602a540","line":14741,"updated":"2018-04-27 12:46:20.000000000","message":"I suggest to add a test case where invalid cell id is used in the numa_nodes","commit_id":"deabe64b9a0f33ce2dd6e1f752c2a569f2030cf0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"785d4cb4aa79b8ebbd03ad5178c06f6f0cf6a4b2","unresolved":false,"context_lines":[{"line_number":14738,"context_line":"            self.assertFalse(got_topo.cells[1].networks.tunnel)"},{"line_number":14739,"context_line":"            self.assertTrue(got_topo.cells[2].networks.tunnel)"},{"line_number":14740,"context_line":"            self.assertFalse(got_topo.cells[3].networks.tunnel)"},{"line_number":14741,"context_line":""},{"line_number":14742,"context_line":"    @mock.patch.object(host.Host, \u0027has_min_version\u0027, return_value\u003dTrue)"},{"line_number":14743,"context_line":"    def test_get_host_numa_topology(self, mock_version):"},{"line_number":14744,"context_line":"        self._test_get_host_numa_topology(mempages\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f6a8fd7_647545fa","line":14741,"in_reply_to":"9f6a8fd7_3772397e","updated":"2018-04-30 10:11:54.000000000","message":"if you do remember that -1 is not an ivalid cell id on linux.\nit is the value that is returned in sysfs when a device has no numa topology reported.","commit_id":"deabe64b9a0f33ce2dd6e1f752c2a569f2030cf0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"06cf70566f386d21fd7844e0ff424c26ea8c0267","unresolved":false,"context_lines":[{"line_number":14738,"context_line":"            self.assertFalse(got_topo.cells[1].networks.tunnel)"},{"line_number":14739,"context_line":"            self.assertTrue(got_topo.cells[2].networks.tunnel)"},{"line_number":14740,"context_line":"            self.assertFalse(got_topo.cells[3].networks.tunnel)"},{"line_number":14741,"context_line":""},{"line_number":14742,"context_line":"    @mock.patch.object(host.Host, \u0027has_min_version\u0027, return_value\u003dTrue)"},{"line_number":14743,"context_line":"    def test_get_host_numa_topology(self, mock_version):"},{"line_number":14744,"context_line":"        self._test_get_host_numa_topology(mempages\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f6a8fd7_3772397e","line":14741,"in_reply_to":"9f6a8fd7_4602a540","updated":"2018-04-27 14:28:52.000000000","message":"Good idea","commit_id":"deabe64b9a0f33ce2dd6e1f752c2a569f2030cf0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"c6dd909d2f926c4e9ce2807da55cde77ea414134","unresolved":false,"context_lines":[{"line_number":14738,"context_line":"            self.assertFalse(got_topo.cells[1].networks.tunnel)"},{"line_number":14739,"context_line":"            self.assertTrue(got_topo.cells[2].networks.tunnel)"},{"line_number":14740,"context_line":"            self.assertFalse(got_topo.cells[3].networks.tunnel)"},{"line_number":14741,"context_line":""},{"line_number":14742,"context_line":"    @mock.patch.object(host.Host, \u0027has_min_version\u0027, return_value\u003dTrue)"},{"line_number":14743,"context_line":"    def test_get_host_numa_topology(self, mock_version):"},{"line_number":14744,"context_line":"        self._test_get_host_numa_topology(mempages\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_063a5135","line":14741,"in_reply_to":"9f6a8fd7_647545fa","updated":"2018-05-07 13:43:11.000000000","message":"Done","commit_id":"deabe64b9a0f33ce2dd6e1f752c2a569f2030cf0"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8f12a997e611ba4850716ab0c41a1a7b2bfab959","unresolved":false,"context_lines":[{"line_number":14607,"context_line":"    def _test_get_host_numa_topology(self, mempages):"},{"line_number":14608,"context_line":"        self.flags(physnets\u003d[\u0027foo\u0027, \u0027bar\u0027], group\u003d\u0027neutron\u0027)"},{"line_number":14609,"context_line":"        manager.ComputeManager._register_dynamic_opts()"},{"line_number":14610,"context_line":"        self.flags(numa_nodes\u003d[0, 2], group\u003d\u0027neutron_tunnel\u0027)"},{"line_number":14611,"context_line":"        self.flags(numa_nodes\u003d[1], group\u003d\u0027neutron_physnet_foo\u0027)"},{"line_number":14612,"context_line":"        self.flags(numa_nodes\u003d[3], group\u003d\u0027neutron_physnet_bar\u0027)"},{"line_number":14613,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_198519ad","line":14610,"range":{"start_line":14610,"start_character":30,"end_line":14610,"end_character":36},"updated":"2018-06-01 21:59:00.000000000","message":"You said this wasn\u0027t allowed.  Are your pants on fire?","commit_id":"02e6224f21f24cf0ecb2f6da097cb3aa63a83d53"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"39dbff45f533ac24000a3e2e6e850bc42feebd9c","unresolved":false,"context_lines":[{"line_number":14607,"context_line":"    def _test_get_host_numa_topology(self, mempages):"},{"line_number":14608,"context_line":"        self.flags(physnets\u003d[\u0027foo\u0027, \u0027bar\u0027], group\u003d\u0027neutron\u0027)"},{"line_number":14609,"context_line":"        manager.ComputeManager._register_dynamic_opts()"},{"line_number":14610,"context_line":"        self.flags(numa_nodes\u003d[0, 2], group\u003d\u0027neutron_tunnel\u0027)"},{"line_number":14611,"context_line":"        self.flags(numa_nodes\u003d[1], group\u003d\u0027neutron_physnet_foo\u0027)"},{"line_number":14612,"context_line":"        self.flags(numa_nodes\u003d[3], group\u003d\u0027neutron_physnet_bar\u0027)"},{"line_number":14613,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_dcd3bc5e","line":14610,"range":{"start_line":14610,"start_character":30,"end_line":14610,"end_character":36},"in_reply_to":"5f7c97a3_198519ad","updated":"2018-06-06 16:01:01.000000000","message":"Other way around. One tunnel endpoint (i.e. a logical network interface) can exist on a compute host. This can still be affined to multiple NUMA nodes on that host (e.g. for bonded NICs).","commit_id":"02e6224f21f24cf0ecb2f6da097cb3aa63a83d53"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c1d8d6275cd8cdb5908e083ab4816b4fd330ea19","unresolved":false,"context_lines":[{"line_number":14607,"context_line":"    def _test_get_host_numa_topology(self, mempages):"},{"line_number":14608,"context_line":"        self.flags(physnets\u003d[\u0027foo\u0027, \u0027bar\u0027], group\u003d\u0027neutron\u0027)"},{"line_number":14609,"context_line":"        manager.ComputeManager._register_dynamic_opts()"},{"line_number":14610,"context_line":"        self.flags(numa_nodes\u003d[0, 2], group\u003d\u0027neutron_tunnel\u0027)"},{"line_number":14611,"context_line":"        self.flags(numa_nodes\u003d[1], group\u003d\u0027neutron_physnet_foo\u0027)"},{"line_number":14612,"context_line":"        self.flags(numa_nodes\u003d[3], group\u003d\u0027neutron_physnet_bar\u0027)"},{"line_number":14613,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_3f498231","line":14610,"range":{"start_line":14610,"start_character":30,"end_line":14610,"end_character":36},"in_reply_to":"5f7c97a3_dcd3bc5e","updated":"2018-06-06 16:24:06.000000000","message":"Thanks.","commit_id":"02e6224f21f24cf0ecb2f6da097cb3aa63a83d53"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8f12a997e611ba4850716ab0c41a1a7b2bfab959","unresolved":false,"context_lines":[{"line_number":14608,"context_line":"        self.flags(physnets\u003d[\u0027foo\u0027, \u0027bar\u0027], group\u003d\u0027neutron\u0027)"},{"line_number":14609,"context_line":"        manager.ComputeManager._register_dynamic_opts()"},{"line_number":14610,"context_line":"        self.flags(numa_nodes\u003d[0, 2], group\u003d\u0027neutron_tunnel\u0027)"},{"line_number":14611,"context_line":"        self.flags(numa_nodes\u003d[1], group\u003d\u0027neutron_physnet_foo\u0027)"},{"line_number":14612,"context_line":"        self.flags(numa_nodes\u003d[3], group\u003d\u0027neutron_physnet_bar\u0027)"},{"line_number":14613,"context_line":""},{"line_number":14614,"context_line":"        caps \u003d vconfig.LibvirtConfigCaps()"},{"line_number":14615,"context_line":"        caps.host \u003d vconfig.LibvirtConfigCapsHost()"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_99c289e8","line":14612,"range":{"start_line":14611,"start_character":8,"end_line":14612,"end_character":63},"updated":"2018-06-01 21:59:00.000000000","message":"These would be more happy-making if they had more numbers, including at least one overlap.","commit_id":"02e6224f21f24cf0ecb2f6da097cb3aa63a83d53"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"39dbff45f533ac24000a3e2e6e850bc42feebd9c","unresolved":false,"context_lines":[{"line_number":14608,"context_line":"        self.flags(physnets\u003d[\u0027foo\u0027, \u0027bar\u0027], group\u003d\u0027neutron\u0027)"},{"line_number":14609,"context_line":"        manager.ComputeManager._register_dynamic_opts()"},{"line_number":14610,"context_line":"        self.flags(numa_nodes\u003d[0, 2], group\u003d\u0027neutron_tunnel\u0027)"},{"line_number":14611,"context_line":"        self.flags(numa_nodes\u003d[1], group\u003d\u0027neutron_physnet_foo\u0027)"},{"line_number":14612,"context_line":"        self.flags(numa_nodes\u003d[3], group\u003d\u0027neutron_physnet_bar\u0027)"},{"line_number":14613,"context_line":""},{"line_number":14614,"context_line":"        caps \u003d vconfig.LibvirtConfigCaps()"},{"line_number":14615,"context_line":"        caps.host \u003d vconfig.LibvirtConfigCapsHost()"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_dc2f3c3c","line":14612,"range":{"start_line":14611,"start_character":8,"end_line":14612,"end_character":63},"in_reply_to":"5f7c97a3_99c289e8","updated":"2018-06-06 16:01:01.000000000","message":"Done","commit_id":"02e6224f21f24cf0ecb2f6da097cb3aa63a83d53"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8f12a997e611ba4850716ab0c41a1a7b2bfab959","unresolved":false,"context_lines":[{"line_number":14718,"context_line":"        self.assertIsNone(drvr._get_host_numa_topology())"},{"line_number":14719,"context_line":""},{"line_number":14720,"context_line":"    @mock.patch.object(host.Host, \u0027has_min_version\u0027, return_value\u003dTrue)"},{"line_number":14721,"context_line":"    def test_get_host_numa_topology_invalid_network_affinity(self,"},{"line_number":14722,"context_line":"            mock_version):"},{"line_number":14723,"context_line":"        self.flags(physnets\u003d[\u0027foo\u0027, \u0027bar\u0027], group\u003d\u0027neutron\u0027)"},{"line_number":14724,"context_line":"        manager.ComputeManager._register_dynamic_opts()"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_f4af04e0","line":14721,"range":{"start_line":14721,"start_character":8,"end_line":14721,"end_character":60},"updated":"2018-06-01 21:59:00.000000000","message":"It would be nice to add a docstring/comment explaining in what way the affinity is invalid in this test case.","commit_id":"02e6224f21f24cf0ecb2f6da097cb3aa63a83d53"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"39dbff45f533ac24000a3e2e6e850bc42feebd9c","unresolved":false,"context_lines":[{"line_number":14718,"context_line":"        self.assertIsNone(drvr._get_host_numa_topology())"},{"line_number":14719,"context_line":""},{"line_number":14720,"context_line":"    @mock.patch.object(host.Host, \u0027has_min_version\u0027, return_value\u003dTrue)"},{"line_number":14721,"context_line":"    def test_get_host_numa_topology_invalid_network_affinity(self,"},{"line_number":14722,"context_line":"            mock_version):"},{"line_number":14723,"context_line":"        self.flags(physnets\u003d[\u0027foo\u0027, \u0027bar\u0027], group\u003d\u0027neutron\u0027)"},{"line_number":14724,"context_line":"        manager.ComputeManager._register_dynamic_opts()"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_9cb784f6","line":14721,"range":{"start_line":14721,"start_character":8,"end_line":14721,"end_character":60},"in_reply_to":"5f7c97a3_f4af04e0","updated":"2018-06-06 16:01:01.000000000","message":"Done","commit_id":"02e6224f21f24cf0ecb2f6da097cb3aa63a83d53"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8f12a997e611ba4850716ab0c41a1a7b2bfab959","unresolved":false,"context_lines":[{"line_number":14722,"context_line":"            mock_version):"},{"line_number":14723,"context_line":"        self.flags(physnets\u003d[\u0027foo\u0027, \u0027bar\u0027], group\u003d\u0027neutron\u0027)"},{"line_number":14724,"context_line":"        manager.ComputeManager._register_dynamic_opts()"},{"line_number":14725,"context_line":"        self.flags(numa_nodes\u003d[4], group\u003d\u0027neutron_physnet_bar\u0027)"},{"line_number":14726,"context_line":""},{"line_number":14727,"context_line":"        caps \u003d vconfig.LibvirtConfigCaps()"},{"line_number":14728,"context_line":"        caps.host \u003d vconfig.LibvirtConfigCapsHost()"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_94881071","line":14725,"range":{"start_line":14725,"start_character":30,"end_line":14725,"end_character":33},"updated":"2018-06-01 21:59:00.000000000","message":"...I think I figured out it\u0027s because fakelibvirt.NUMATopology creates cells 0-3 by default, so this one doesn\u0027t exist, yah?","commit_id":"02e6224f21f24cf0ecb2f6da097cb3aa63a83d53"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"39dbff45f533ac24000a3e2e6e850bc42feebd9c","unresolved":false,"context_lines":[{"line_number":14722,"context_line":"            mock_version):"},{"line_number":14723,"context_line":"        self.flags(physnets\u003d[\u0027foo\u0027, \u0027bar\u0027], group\u003d\u0027neutron\u0027)"},{"line_number":14724,"context_line":"        manager.ComputeManager._register_dynamic_opts()"},{"line_number":14725,"context_line":"        self.flags(numa_nodes\u003d[4], group\u003d\u0027neutron_physnet_bar\u0027)"},{"line_number":14726,"context_line":""},{"line_number":14727,"context_line":"        caps \u003d vconfig.LibvirtConfigCaps()"},{"line_number":14728,"context_line":"        caps.host \u003d vconfig.LibvirtConfigCapsHost()"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_bcba80de","line":14725,"range":{"start_line":14725,"start_character":30,"end_line":14725,"end_character":33},"in_reply_to":"5f7c97a3_94881071","updated":"2018-06-06 16:01:01.000000000","message":"Correctamundo","commit_id":"02e6224f21f24cf0ecb2f6da097cb3aa63a83d53"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8f12a997e611ba4850716ab0c41a1a7b2bfab959","unresolved":false,"context_lines":[{"line_number":14724,"context_line":"        manager.ComputeManager._register_dynamic_opts()"},{"line_number":14725,"context_line":"        self.flags(numa_nodes\u003d[4], group\u003d\u0027neutron_physnet_bar\u0027)"},{"line_number":14726,"context_line":""},{"line_number":14727,"context_line":"        caps \u003d vconfig.LibvirtConfigCaps()"},{"line_number":14728,"context_line":"        caps.host \u003d vconfig.LibvirtConfigCapsHost()"},{"line_number":14729,"context_line":"        caps.host.cpu \u003d vconfig.LibvirtConfigCPU()"},{"line_number":14730,"context_line":"        caps.host.cpu.arch \u003d fields.Architecture.X86_64"},{"line_number":14731,"context_line":"        caps.host.topology \u003d fakelibvirt.NUMATopology()"},{"line_number":14732,"context_line":""},{"line_number":14733,"context_line":"        drvr \u003d libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)"},{"line_number":14734,"context_line":"        with test.nested("}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_9967e925","line":14731,"range":{"start_line":14727,"start_character":8,"end_line":14731,"end_character":55},"updated":"2018-06-01 21:59:00.000000000","message":"Could maybe factor this out into a helper, since it\u0027s used at least thrice that I can see.\n\n def set_caps(is_numa\u003dFalse):\n     caps \u003d vconfig.LibvirtConfigCaps()\n     caps.host \u003d vconfig.LibvirtConfigCapsHost()\n     caps.host.cpu \u003d vconfig.LibvirtConfigCPU()\n     caps.host.cpu.arch \u003d fields.Architecture.X86_64\n     caps.host.topology \u003d fakelibvirt.NUMATopology() if is_numa else None","commit_id":"02e6224f21f24cf0ecb2f6da097cb3aa63a83d53"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c1d8d6275cd8cdb5908e083ab4816b4fd330ea19","unresolved":false,"context_lines":[{"line_number":14724,"context_line":"        manager.ComputeManager._register_dynamic_opts()"},{"line_number":14725,"context_line":"        self.flags(numa_nodes\u003d[4], group\u003d\u0027neutron_physnet_bar\u0027)"},{"line_number":14726,"context_line":""},{"line_number":14727,"context_line":"        caps \u003d vconfig.LibvirtConfigCaps()"},{"line_number":14728,"context_line":"        caps.host \u003d vconfig.LibvirtConfigCapsHost()"},{"line_number":14729,"context_line":"        caps.host.cpu \u003d vconfig.LibvirtConfigCPU()"},{"line_number":14730,"context_line":"        caps.host.cpu.arch \u003d fields.Architecture.X86_64"},{"line_number":14731,"context_line":"        caps.host.topology \u003d fakelibvirt.NUMATopology()"},{"line_number":14732,"context_line":""},{"line_number":14733,"context_line":"        drvr \u003d libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)"},{"line_number":14734,"context_line":"        with test.nested("}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_df616eaa","line":14731,"range":{"start_line":14727,"start_character":8,"end_line":14731,"end_character":55},"in_reply_to":"5f7c97a3_5cc9ec76","updated":"2018-06-06 16:24:06.000000000","message":"Sure; that was a totally optional random note.","commit_id":"02e6224f21f24cf0ecb2f6da097cb3aa63a83d53"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"39dbff45f533ac24000a3e2e6e850bc42feebd9c","unresolved":false,"context_lines":[{"line_number":14724,"context_line":"        manager.ComputeManager._register_dynamic_opts()"},{"line_number":14725,"context_line":"        self.flags(numa_nodes\u003d[4], group\u003d\u0027neutron_physnet_bar\u0027)"},{"line_number":14726,"context_line":""},{"line_number":14727,"context_line":"        caps \u003d vconfig.LibvirtConfigCaps()"},{"line_number":14728,"context_line":"        caps.host \u003d vconfig.LibvirtConfigCapsHost()"},{"line_number":14729,"context_line":"        caps.host.cpu \u003d vconfig.LibvirtConfigCPU()"},{"line_number":14730,"context_line":"        caps.host.cpu.arch \u003d fields.Architecture.X86_64"},{"line_number":14731,"context_line":"        caps.host.topology \u003d fakelibvirt.NUMATopology()"},{"line_number":14732,"context_line":""},{"line_number":14733,"context_line":"        drvr \u003d libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)"},{"line_number":14734,"context_line":"        with test.nested("}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_5cc9ec76","line":14731,"range":{"start_line":14727,"start_character":8,"end_line":14731,"end_character":55},"in_reply_to":"5f7c97a3_9967e925","updated":"2018-06-06 16:01:01.000000000","message":"Um, I _could_, but I think it would make things less clear. I\u0027ll leave a TODO to investigate","commit_id":"02e6224f21f24cf0ecb2f6da097cb3aa63a83d53"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8f12a997e611ba4850716ab0c41a1a7b2bfab959","unresolved":false,"context_lines":[{"line_number":14731,"context_line":"        caps.host.topology \u003d fakelibvirt.NUMATopology()"},{"line_number":14732,"context_line":""},{"line_number":14733,"context_line":"        drvr \u003d libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)"},{"line_number":14734,"context_line":"        with test.nested("},{"line_number":14735,"context_line":"                mock.patch.object(host.Host, \"get_capabilities\","},{"line_number":14736,"context_line":"                                  return_value\u003dcaps),"},{"line_number":14737,"context_line":"                mock.patch.object(hardware, \u0027get_vcpu_pin_set\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_5946317d","line":14734,"range":{"start_line":14734,"start_character":8,"end_line":14734,"end_character":25},"updated":"2018-06-01 21:59:00.000000000","message":"This is not necessary.","commit_id":"02e6224f21f24cf0ecb2f6da097cb3aa63a83d53"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"39dbff45f533ac24000a3e2e6e850bc42feebd9c","unresolved":false,"context_lines":[{"line_number":14731,"context_line":"        caps.host.topology \u003d fakelibvirt.NUMATopology()"},{"line_number":14732,"context_line":""},{"line_number":14733,"context_line":"        drvr \u003d libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)"},{"line_number":14734,"context_line":"        with test.nested("},{"line_number":14735,"context_line":"                mock.patch.object(host.Host, \"get_capabilities\","},{"line_number":14736,"context_line":"                                  return_value\u003dcaps),"},{"line_number":14737,"context_line":"                mock.patch.object(hardware, \u0027get_vcpu_pin_set\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_5cbfacfb","line":14734,"range":{"start_line":14734,"start_character":8,"end_line":14734,"end_character":25},"in_reply_to":"5f7c97a3_5946317d","updated":"2018-06-06 16:01:01.000000000","message":"No? What\u0027s the alternative?","commit_id":"02e6224f21f24cf0ecb2f6da097cb3aa63a83d53"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c1d8d6275cd8cdb5908e083ab4816b4fd330ea19","unresolved":false,"context_lines":[{"line_number":14731,"context_line":"        caps.host.topology \u003d fakelibvirt.NUMATopology()"},{"line_number":14732,"context_line":""},{"line_number":14733,"context_line":"        drvr \u003d libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)"},{"line_number":14734,"context_line":"        with test.nested("},{"line_number":14735,"context_line":"                mock.patch.object(host.Host, \"get_capabilities\","},{"line_number":14736,"context_line":"                                  return_value\u003dcaps),"},{"line_number":14737,"context_line":"                mock.patch.object(hardware, \u0027get_vcpu_pin_set\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_1fea86d7","line":14734,"range":{"start_line":14734,"start_character":8,"end_line":14734,"end_character":25},"in_reply_to":"5f7c97a3_5cbfacfb","updated":"2018-06-06 16:24:06.000000000","message":"See [1]:\n\n with (mock.patch.object(...),\n       mock.patch.object(...),\n       mock.patch.object(...)):\n\n[1] https://stackoverflow.com/questions/893333/multiple-variables-in-python-with-statement","commit_id":"02e6224f21f24cf0ecb2f6da097cb3aa63a83d53"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"43fd80761bb7c93c8bfa13660ae3b36b5c102d7c","unresolved":false,"context_lines":[{"line_number":15126,"context_line":"    # \u0027mempages\u003dFalse\u0027 branches or add the missing test"},{"line_number":15127,"context_line":"    def _test_get_host_numa_topology(self, mempages):"},{"line_number":15128,"context_line":"        self.flags(physnets\u003d[\u0027foo\u0027, \u0027bar\u0027, \u0027baz\u0027], group\u003d\u0027neutron\u0027)"},{"line_number":15129,"context_line":"        nova.conf.neutron.register_dynamic_opts(CONF)"},{"line_number":15130,"context_line":"        self.flags(numa_nodes\u003d[0, 2], group\u003d\u0027neutron_tunnel\u0027)"},{"line_number":15131,"context_line":"        self.flags(numa_nodes\u003d[1], group\u003d\u0027neutron_physnet_foo\u0027)"},{"line_number":15132,"context_line":"        self.flags(numa_nodes\u003d[3], group\u003d\u0027neutron_physnet_bar\u0027)"}],"source_content_type":"text/x-python","patch_set":24,"id":"5f7c97a3_241b2ecb","line":15129,"range":{"start_line":15129,"start_character":8,"end_line":15129,"end_character":53},"updated":"2018-07-19 16:43:08.000000000","message":"Why is this needed? If you do it in ConfFixture, it will already be done in the setup for the test class.","commit_id":"843aff2e602d13d9cc5d72e76e81499e9f8b8ce5"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bed8181a0e0107adb53a3578caed7e06f700d656","unresolved":false,"context_lines":[{"line_number":15126,"context_line":"    # \u0027mempages\u003dFalse\u0027 branches or add the missing test"},{"line_number":15127,"context_line":"    def _test_get_host_numa_topology(self, mempages):"},{"line_number":15128,"context_line":"        self.flags(physnets\u003d[\u0027foo\u0027, \u0027bar\u0027, \u0027baz\u0027], group\u003d\u0027neutron\u0027)"},{"line_number":15129,"context_line":"        nova.conf.neutron.register_dynamic_opts(CONF)"},{"line_number":15130,"context_line":"        self.flags(numa_nodes\u003d[0, 2], group\u003d\u0027neutron_tunnel\u0027)"},{"line_number":15131,"context_line":"        self.flags(numa_nodes\u003d[1], group\u003d\u0027neutron_physnet_foo\u0027)"},{"line_number":15132,"context_line":"        self.flags(numa_nodes\u003d[3], group\u003d\u0027neutron_physnet_bar\u0027)"}],"source_content_type":"text/x-python","patch_set":24,"id":"5f7c97a3_8f69fbc0","line":15129,"range":{"start_line":15129,"start_character":8,"end_line":15129,"end_character":53},"in_reply_to":"5f7c97a3_241b2ecb","updated":"2018-07-19 16:53:17.000000000","message":"It\u0027s necessary because I\u0027ve changed configuration in the line above and I need to have the new groups created. I\u0027ll add a note","commit_id":"843aff2e602d13d9cc5d72e76e81499e9f8b8ce5"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1ad54e921956e261248c880e267360305b5b0d6d","unresolved":false,"context_lines":[{"line_number":15126,"context_line":"    # \u0027mempages\u003dFalse\u0027 branches or add the missing test"},{"line_number":15127,"context_line":"    def _test_get_host_numa_topology(self, mempages):"},{"line_number":15128,"context_line":"        self.flags(physnets\u003d[\u0027foo\u0027, \u0027bar\u0027, \u0027baz\u0027], group\u003d\u0027neutron\u0027)"},{"line_number":15129,"context_line":"        nova.conf.neutron.register_dynamic_opts(CONF)"},{"line_number":15130,"context_line":"        self.flags(numa_nodes\u003d[0, 2], group\u003d\u0027neutron_tunnel\u0027)"},{"line_number":15131,"context_line":"        self.flags(numa_nodes\u003d[1], group\u003d\u0027neutron_physnet_foo\u0027)"},{"line_number":15132,"context_line":"        self.flags(numa_nodes\u003d[3], group\u003d\u0027neutron_physnet_bar\u0027)"}],"source_content_type":"text/x-python","patch_set":24,"id":"5f7c97a3_8f0d7b41","line":15129,"range":{"start_line":15129,"start_character":8,"end_line":15129,"end_character":53},"in_reply_to":"5f7c97a3_4f71a376","updated":"2018-07-19 17:22:52.000000000","message":"Yeah, it doesn\u0027t work that way. You need to call \u0027add_group\u0027 or whatever to register a group. We could hack on oslo.config to ensure that whenever the above attribute is called this happens automatically but that seems like overkill. Maybe a feature request for a future version of oslo.config?","commit_id":"843aff2e602d13d9cc5d72e76e81499e9f8b8ce5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"edd6aa73acc9a6e9313ad459a569c298e363751a","unresolved":false,"context_lines":[{"line_number":15126,"context_line":"    # \u0027mempages\u003dFalse\u0027 branches or add the missing test"},{"line_number":15127,"context_line":"    def _test_get_host_numa_topology(self, mempages):"},{"line_number":15128,"context_line":"        self.flags(physnets\u003d[\u0027foo\u0027, \u0027bar\u0027, \u0027baz\u0027], group\u003d\u0027neutron\u0027)"},{"line_number":15129,"context_line":"        nova.conf.neutron.register_dynamic_opts(CONF)"},{"line_number":15130,"context_line":"        self.flags(numa_nodes\u003d[0, 2], group\u003d\u0027neutron_tunnel\u0027)"},{"line_number":15131,"context_line":"        self.flags(numa_nodes\u003d[1], group\u003d\u0027neutron_physnet_foo\u0027)"},{"line_number":15132,"context_line":"        self.flags(numa_nodes\u003d[3], group\u003d\u0027neutron_physnet_bar\u0027)"}],"source_content_type":"text/x-python","patch_set":24,"id":"5f7c97a3_4f71a376","line":15129,"range":{"start_line":15129,"start_character":8,"end_line":15129,"end_character":53},"in_reply_to":"5f7c97a3_8f69fbc0","updated":"2018-07-19 16:57:42.000000000","message":"But why can\u0027t we set flags after registering the dynamic groups? Or does it not work that way?","commit_id":"843aff2e602d13d9cc5d72e76e81499e9f8b8ce5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"43fd80761bb7c93c8bfa13660ae3b36b5c102d7c","unresolved":false,"context_lines":[{"line_number":15230,"context_line":"    def test_get_host_numa_topology_missing_network_metadata(self,"},{"line_number":15231,"context_line":"            mock_version):"},{"line_number":15232,"context_line":"        self.flags(physnets\u003d[\u0027bar\u0027], group\u003d\u0027neutron\u0027)"},{"line_number":15233,"context_line":"        nova.conf.neutron.register_dynamic_opts(CONF)"},{"line_number":15234,"context_line":""},{"line_number":15235,"context_line":"        # we explicitly avoid registering a \u0027[neutron_physnets_bar] numa_nodes\u0027"},{"line_number":15236,"context_line":"        # option here"}],"source_content_type":"text/x-python","patch_set":24,"id":"5f7c97a3_e45f7672","line":15233,"range":{"start_line":15233,"start_character":8,"end_line":15233,"end_character":53},"updated":"2018-07-19 16:43:08.000000000","message":"Again, shouldn\u0027t need this.","commit_id":"843aff2e602d13d9cc5d72e76e81499e9f8b8ce5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"43fd80761bb7c93c8bfa13660ae3b36b5c102d7c","unresolved":false,"context_lines":[{"line_number":15259,"context_line":"    def _test_get_host_numa_topology_invalid_network_affinity(self,"},{"line_number":15260,"context_line":"            group_name, mock_version):"},{"line_number":15261,"context_line":"        self.flags(physnets\u003d[\u0027foo\u0027, \u0027bar\u0027], group\u003d\u0027neutron\u0027)"},{"line_number":15262,"context_line":"        nova.conf.neutron.register_dynamic_opts(CONF)"},{"line_number":15263,"context_line":""},{"line_number":15264,"context_line":"        # set defaults..."},{"line_number":15265,"context_line":"        for group_ in [\u0027neutron_physnet_foo\u0027, \u0027neutron_physnet_bar\u0027,"}],"source_content_type":"text/x-python","patch_set":24,"id":"5f7c97a3_a455fe53","line":15262,"range":{"start_line":15262,"start_character":8,"end_line":15262,"end_character":53},"updated":"2018-07-19 16:43:08.000000000","message":"same","commit_id":"843aff2e602d13d9cc5d72e76e81499e9f8b8ce5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1317b995c2cd0985ab2d07f50f7cd120282c510e","unresolved":false,"context_lines":[{"line_number":15125,"context_line":"    # TODO(stephenfin): This only has one caller. Flatten it and remove the"},{"line_number":15126,"context_line":"    # \u0027mempages\u003dFalse\u0027 branches or add the missing test"},{"line_number":15127,"context_line":"    def _test_get_host_numa_topology(self, mempages):"},{"line_number":15128,"context_line":"        self.flags(physnets\u003d[\u0027foo\u0027, \u0027bar\u0027, \u0027baz\u0027], group\u003d\u0027neutron\u0027)"},{"line_number":15129,"context_line":"        # we need to call the below again to ensure the updated \u0027physnets\u0027"},{"line_number":15130,"context_line":"        # value is read and the new groups created"},{"line_number":15131,"context_line":"        nova.conf.neutron.register_dynamic_opts(CONF)"},{"line_number":15132,"context_line":"        self.flags(numa_nodes\u003d[0, 2], group\u003d\u0027neutron_tunnel\u0027)"},{"line_number":15133,"context_line":"        self.flags(numa_nodes\u003d[1], group\u003d\u0027neutron_physnet_foo\u0027)"},{"line_number":15134,"context_line":"        self.flags(numa_nodes\u003d[3], group\u003d\u0027neutron_physnet_bar\u0027)"}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_df5c6a1b","line":15131,"range":{"start_line":15128,"start_character":7,"end_line":15131,"end_character":53},"updated":"2018-07-20 14:50:21.000000000","message":"nit: you could handle this in a follow up, but if we have to reload this everytime we set anything on these options, let\u0027s just add a check for this in the flags() method itself that if the key is physnets in the neutron group, auto-reload so every caller doesn\u0027t have to worry about this.","commit_id":"dd04e73f3f117b592fb18080f6ff77ac7f613da2"}],"nova/virt/libvirt/driver.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"482bbce5c327095cb8925591f71808eb86bf616a","unresolved":false,"context_lines":[{"line_number":6252,"context_line":"            for physnet in CONF.neutron.physnets:"},{"line_number":6253,"context_line":"                # TODO(stephenfin): There should be a way to do this that"},{"line_number":6254,"context_line":"                # doesn\u0027t access internal APIs"},{"line_number":6255,"context_line":"                group \u003d CONF._do_get(\u0027neutron_physnet_%s\u0027 % physnet)[0]"},{"line_number":6256,"context_line":""},{"line_number":6257,"context_line":"                if not group.numa_nodes:"},{"line_number":6258,"context_line":"                    continue"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f6a8fd7_a61141af","line":6255,"updated":"2018-04-27 12:46:20.000000000","message":"Doesn\u0027t group \u003d get(CONF, \u0027neutron_physnet_%s\u0027 % physnet) do the trick?","commit_id":"deabe64b9a0f33ce2dd6e1f752c2a569f2030cf0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"06cf70566f386d21fd7844e0ff424c26ea8c0267","unresolved":false,"context_lines":[{"line_number":6252,"context_line":"            for physnet in CONF.neutron.physnets:"},{"line_number":6253,"context_line":"                # TODO(stephenfin): There should be a way to do this that"},{"line_number":6254,"context_line":"                # doesn\u0027t access internal APIs"},{"line_number":6255,"context_line":"                group \u003d CONF._do_get(\u0027neutron_physnet_%s\u0027 % physnet)[0]"},{"line_number":6256,"context_line":""},{"line_number":6257,"context_line":"                if not group.numa_nodes:"},{"line_number":6258,"context_line":"                    continue"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f6a8fd7_b703a9be","line":6255,"in_reply_to":"9f6a8fd7_a61141af","updated":"2018-04-27 14:28:52.000000000","message":"I\u0027m pretty sure I tried that and it failed with a \"this group does not exist\" warning. I\u0027ll try again though.","commit_id":"deabe64b9a0f33ce2dd6e1f752c2a569f2030cf0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"785d4cb4aa79b8ebbd03ad5178c06f6f0cf6a4b2","unresolved":false,"context_lines":[{"line_number":6254,"context_line":"                # doesn\u0027t access internal APIs"},{"line_number":6255,"context_line":"                group \u003d CONF._do_get(\u0027neutron_physnet_%s\u0027 % physnet)[0]"},{"line_number":6256,"context_line":""},{"line_number":6257,"context_line":"                if not group.numa_nodes:"},{"line_number":6258,"context_line":"                    continue"},{"line_number":6259,"context_line":""},{"line_number":6260,"context_line":"                for node in group.numa_nodes:"},{"line_number":6261,"context_line":"                    if node not in affinities:"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f6a8fd7_4499211d","line":6258,"range":{"start_line":6257,"start_character":16,"end_line":6258,"end_character":28},"updated":"2018-04-30 10:11:54.000000000","message":"so this captures when its unset and set to []","commit_id":"deabe64b9a0f33ce2dd6e1f752c2a569f2030cf0"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"82b9f4f6efdac13aba56d632b4dc34c9e010b4cb","unresolved":false,"context_lines":[{"line_number":6260,"context_line":"                for node in group.numa_nodes:"},{"line_number":6261,"context_line":"                    if node not in affinities:"},{"line_number":6262,"context_line":"                        # The referenced an invalid node"},{"line_number":6263,"context_line":"                        raise Exception(\u0027Misconfiguration\u0027)"},{"line_number":6264,"context_line":"                    affinities[node].append(physnet)"},{"line_number":6265,"context_line":""},{"line_number":6266,"context_line":"            return affinities"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f6a8fd7_eccdef86","line":6263,"range":{"start_line":6263,"start_character":24,"end_line":6263,"end_character":59},"updated":"2018-04-26 15:25:03.000000000","message":"a little vague, no? :)","commit_id":"deabe64b9a0f33ce2dd6e1f752c2a569f2030cf0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"785d4cb4aa79b8ebbd03ad5178c06f6f0cf6a4b2","unresolved":false,"context_lines":[{"line_number":6260,"context_line":"                for node in group.numa_nodes:"},{"line_number":6261,"context_line":"                    if node not in affinities:"},{"line_number":6262,"context_line":"                        # The referenced an invalid node"},{"line_number":6263,"context_line":"                        raise Exception(\u0027Misconfiguration\u0027)"},{"line_number":6264,"context_line":"                    affinities[node].append(physnet)"},{"line_number":6265,"context_line":""},{"line_number":6266,"context_line":"            return affinities"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f6a8fd7_4703630e","line":6263,"range":{"start_line":6263,"start_character":24,"end_line":6263,"end_character":59},"in_reply_to":"9f6a8fd7_0cff0335","updated":"2018-04-30 10:11:54.000000000","message":"ya probably somthing line NumaAffinityConfigException(\"node: %(node)s for physnet %(physnet)s is not present in host affinity set: %(affinites)s\",{\"node\":node,\"physnet\":physnet,\"affinities\":affinities). \n\nthis is catching the case that i specify something liken \nnuma_node\u003d2\nwhen the systems only has nodes 0 and 1.\n\nhave we documented anyhwere that numa nodes is counted form 0 and not 1. we might want to add that to the config option description.","commit_id":"deabe64b9a0f33ce2dd6e1f752c2a569f2030cf0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"06cf70566f386d21fd7844e0ff424c26ea8c0267","unresolved":false,"context_lines":[{"line_number":6260,"context_line":"                for node in group.numa_nodes:"},{"line_number":6261,"context_line":"                    if node not in affinities:"},{"line_number":6262,"context_line":"                        # The referenced an invalid node"},{"line_number":6263,"context_line":"                        raise Exception(\u0027Misconfiguration\u0027)"},{"line_number":6264,"context_line":"                    affinities[node].append(physnet)"},{"line_number":6265,"context_line":""},{"line_number":6266,"context_line":"            return affinities"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f6a8fd7_0cff0335","line":6263,"range":{"start_line":6263,"start_character":24,"end_line":6263,"end_character":59},"in_reply_to":"9f6a8fd7_eccdef86","updated":"2018-04-27 14:28:52.000000000","message":"Yeah, this should really have a TODO above it. I wasn\u0027t sure what exception to raise. I guess I should invent one?","commit_id":"deabe64b9a0f33ce2dd6e1f752c2a569f2030cf0"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"82b9f4f6efdac13aba56d632b4dc34c9e010b4cb","unresolved":false,"context_lines":[{"line_number":6290,"context_line":""},{"line_number":6291,"context_line":"            networks \u003d objects.NUMANetworkTopology("},{"line_number":6292,"context_line":"                physnets\u003dnetwork_affinities[cell.id],"},{"line_number":6293,"context_line":"                tunnel\u003dcell.id in CONF.neutron_tunnel.numa_nodes)"},{"line_number":6294,"context_line":""},{"line_number":6295,"context_line":"            cell \u003d objects.NUMACell(id\u003dcell.id, cpuset\u003dcpuset,"},{"line_number":6296,"context_line":"                                    memory\u003dcell.memory / units.Ki,"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f6a8fd7_4ceadbac","line":6293,"range":{"start_line":6293,"start_character":34,"end_line":6293,"end_character":64},"updated":"2018-04-26 15:25:03.000000000","message":"Hmm, I see now how this CONF.neutron_tunnel group is used. I\u0027m not all that excited about it... I was thinking there would be a setup more like this:\n\n [neutron_physnet_XXX]\n tunnel \u003d False\n numa_nodes \u003d 0, 1\n\nAnd that in grabbing CONF.neutron_physnet_XXX.tunnel would be the way we\u0027d be finding whether a network provider uses tunneling?","commit_id":"deabe64b9a0f33ce2dd6e1f752c2a569f2030cf0"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"482bbce5c327095cb8925591f71808eb86bf616a","unresolved":false,"context_lines":[{"line_number":6290,"context_line":""},{"line_number":6291,"context_line":"            networks \u003d objects.NUMANetworkTopology("},{"line_number":6292,"context_line":"                physnets\u003dnetwork_affinities[cell.id],"},{"line_number":6293,"context_line":"                tunnel\u003dcell.id in CONF.neutron_tunnel.numa_nodes)"},{"line_number":6294,"context_line":""},{"line_number":6295,"context_line":"            cell \u003d objects.NUMACell(id\u003dcell.id, cpuset\u003dcpuset,"},{"line_number":6296,"context_line":"                                    memory\u003dcell.memory / units.Ki,"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f6a8fd7_a6b5c1cf","line":6293,"range":{"start_line":6293,"start_character":34,"end_line":6293,"end_character":64},"in_reply_to":"9f6a8fd7_4ceadbac","updated":"2018-04-27 12:46:20.000000000","message":"@Jay: But we don\u0027t need a tunnel boolean per physnet we only need to say if a tunneling agent is running on this compute then what NUMA node that agent is using to send the traffic.","commit_id":"deabe64b9a0f33ce2dd6e1f752c2a569f2030cf0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"06cf70566f386d21fd7844e0ff424c26ea8c0267","unresolved":false,"context_lines":[{"line_number":6290,"context_line":""},{"line_number":6291,"context_line":"            networks \u003d objects.NUMANetworkTopology("},{"line_number":6292,"context_line":"                physnets\u003dnetwork_affinities[cell.id],"},{"line_number":6293,"context_line":"                tunnel\u003dcell.id in CONF.neutron_tunnel.numa_nodes)"},{"line_number":6294,"context_line":""},{"line_number":6295,"context_line":"            cell \u003d objects.NUMACell(id\u003dcell.id, cpuset\u003dcpuset,"},{"line_number":6296,"context_line":"                                    memory\u003dcell.memory / units.Ki,"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f6a8fd7_60bb2372","line":6293,"range":{"start_line":6293,"start_character":34,"end_line":6293,"end_character":64},"in_reply_to":"9f6a8fd7_4ceadbac","updated":"2018-04-27 14:28:52.000000000","message":"What gibi says below. Also, see my comment in the previous patch","commit_id":"deabe64b9a0f33ce2dd6e1f752c2a569f2030cf0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"785d4cb4aa79b8ebbd03ad5178c06f6f0cf6a4b2","unresolved":false,"context_lines":[{"line_number":6290,"context_line":""},{"line_number":6291,"context_line":"            networks \u003d objects.NUMANetworkTopology("},{"line_number":6292,"context_line":"                physnets\u003dnetwork_affinities[cell.id],"},{"line_number":6293,"context_line":"                tunnel\u003dcell.id in CONF.neutron_tunnel.numa_nodes)"},{"line_number":6294,"context_line":""},{"line_number":6295,"context_line":"            cell \u003d objects.NUMACell(id\u003dcell.id, cpuset\u003dcpuset,"},{"line_number":6296,"context_line":"                                    memory\u003dcell.memory / units.Ki,"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f6a8fd7_27274fb9","line":6293,"range":{"start_line":6293,"start_character":34,"end_line":6293,"end_character":64},"in_reply_to":"9f6a8fd7_60bb2372","updated":"2018-04-30 10:11:54.000000000","message":"i dont know if you saw my comment on the previous patch yet but tunnels have an implicit physnet of the None object. we could just define neutron_physenet_none as a tunnel provider and remove both the expcit bool and seperate group.","commit_id":"deabe64b9a0f33ce2dd6e1f752c2a569f2030cf0"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8f12a997e611ba4850716ab0c41a1a7b2bfab959","unresolved":false,"context_lines":[{"line_number":6196,"context_line":"        def _get_physnet_numa_affinity():"},{"line_number":6197,"context_line":"            affinities \u003d {cell.id: [] for cell in topology.cells}"},{"line_number":6198,"context_line":"            for physnet in CONF.neutron.physnets:"},{"line_number":6199,"context_line":"                # TODO(stephenfin): There should be a way to do this that"},{"line_number":6200,"context_line":"                # doesn\u0027t access internal APIs"},{"line_number":6201,"context_line":"                group \u003d CONF._do_get(\u0027neutron_physnet_%s\u0027 % physnet)[0]"},{"line_number":6202,"context_line":""},{"line_number":6203,"context_line":"                if not group.numa_nodes:"},{"line_number":6204,"context_line":"                    continue"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_b4474c4c","line":6201,"range":{"start_line":6199,"start_character":0,"end_line":6201,"end_character":71},"updated":"2018-06-01 21:59:00.000000000","message":"This works for me:\n\n group \u003d getattr(CONF, \u0027neutron_physnet_%s\u0027 % physnet)","commit_id":"02e6224f21f24cf0ecb2f6da097cb3aa63a83d53"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"39dbff45f533ac24000a3e2e6e850bc42feebd9c","unresolved":false,"context_lines":[{"line_number":6196,"context_line":"        def _get_physnet_numa_affinity():"},{"line_number":6197,"context_line":"            affinities \u003d {cell.id: [] for cell in topology.cells}"},{"line_number":6198,"context_line":"            for physnet in CONF.neutron.physnets:"},{"line_number":6199,"context_line":"                # TODO(stephenfin): There should be a way to do this that"},{"line_number":6200,"context_line":"                # doesn\u0027t access internal APIs"},{"line_number":6201,"context_line":"                group \u003d CONF._do_get(\u0027neutron_physnet_%s\u0027 % physnet)[0]"},{"line_number":6202,"context_line":""},{"line_number":6203,"context_line":"                if not group.numa_nodes:"},{"line_number":6204,"context_line":"                    continue"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_dc389ca0","line":6201,"range":{"start_line":6199,"start_character":0,"end_line":6201,"end_character":71},"in_reply_to":"5f7c97a3_b4474c4c","updated":"2018-06-06 16:01:01.000000000","message":"IIRC it didn\u0027t work at runtime for me. I\u0027ll stick it in and see how I get on, I guess? :)","commit_id":"02e6224f21f24cf0ecb2f6da097cb3aa63a83d53"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c1d8d6275cd8cdb5908e083ab4816b4fd330ea19","unresolved":false,"context_lines":[{"line_number":6196,"context_line":"        def _get_physnet_numa_affinity():"},{"line_number":6197,"context_line":"            affinities \u003d {cell.id: [] for cell in topology.cells}"},{"line_number":6198,"context_line":"            for physnet in CONF.neutron.physnets:"},{"line_number":6199,"context_line":"                # TODO(stephenfin): There should be a way to do this that"},{"line_number":6200,"context_line":"                # doesn\u0027t access internal APIs"},{"line_number":6201,"context_line":"                group \u003d CONF._do_get(\u0027neutron_physnet_%s\u0027 % physnet)[0]"},{"line_number":6202,"context_line":""},{"line_number":6203,"context_line":"                if not group.numa_nodes:"},{"line_number":6204,"context_line":"                    continue"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_9fb776f6","line":6201,"range":{"start_line":6199,"start_character":0,"end_line":6201,"end_character":71},"in_reply_to":"5f7c97a3_dc389ca0","updated":"2018-06-06 16:24:06.000000000","message":"oh, hum, I only tried it in the test suite.  It\u0027s certainly possible that oslo_config behaves differently at runtime :)","commit_id":"02e6224f21f24cf0ecb2f6da097cb3aa63a83d53"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8f12a997e611ba4850716ab0c41a1a7b2bfab959","unresolved":false,"context_lines":[{"line_number":6226,"context_line":"                    msg \u003d (\"node %d for tunnelled networks is not present \""},{"line_number":6227,"context_line":"                           \"in host affinity set %r\" % (node, affinities))"},{"line_number":6228,"context_line":"                    # The referenced an invalid node"},{"line_number":6229,"context_line":"                    raise exception.InvalidNetworkNUMAAffinity(reason\u003dmsg)"},{"line_number":6230,"context_line":"                affinities[node] \u003d True"},{"line_number":6231,"context_line":""},{"line_number":6232,"context_line":"            return affinities"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_f49864c0","line":6229,"range":{"start_line":6229,"start_character":36,"end_line":6229,"end_character":62},"updated":"2018-06-01 21:59:00.000000000","message":"test case for this \u0027un.","commit_id":"02e6224f21f24cf0ecb2f6da097cb3aa63a83d53"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"39dbff45f533ac24000a3e2e6e850bc42feebd9c","unresolved":false,"context_lines":[{"line_number":6226,"context_line":"                    msg \u003d (\"node %d for tunnelled networks is not present \""},{"line_number":6227,"context_line":"                           \"in host affinity set %r\" % (node, affinities))"},{"line_number":6228,"context_line":"                    # The referenced an invalid node"},{"line_number":6229,"context_line":"                    raise exception.InvalidNetworkNUMAAffinity(reason\u003dmsg)"},{"line_number":6230,"context_line":"                affinities[node] \u003d True"},{"line_number":6231,"context_line":""},{"line_number":6232,"context_line":"            return affinities"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_7cfe286c","line":6229,"range":{"start_line":6229,"start_character":36,"end_line":6229,"end_character":62},"in_reply_to":"5f7c97a3_f49864c0","updated":"2018-06-06 16:01:01.000000000","message":"Done","commit_id":"02e6224f21f24cf0ecb2f6da097cb3aa63a83d53"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"78235dee83cba4073b058c72e7fe0304de55a2e4","unresolved":false,"context_lines":[{"line_number":6219,"context_line":"            for physnet in CONF.neutron.physnets:"},{"line_number":6220,"context_line":"                group \u003d getattr(CONF, \u0027neutron_physnet_%s\u0027 % physnet)"},{"line_number":6221,"context_line":""},{"line_number":6222,"context_line":"                if not group.numa_nodes:"},{"line_number":6223,"context_line":"                    continue"},{"line_number":6224,"context_line":""},{"line_number":6225,"context_line":"                for node in group.numa_nodes:"},{"line_number":6226,"context_line":"                    if node not in affinities:"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_9520a0f9","line":6223,"range":{"start_line":6222,"start_character":0,"end_line":6223,"end_character":28},"updated":"2018-06-07 13:32:05.000000000","message":"no need of this, right?\n\nBeside of that what is happening if numa_nodes is not defined in CONF for a specific network. Is it something we accept?","commit_id":"06532915e422e45a10380eae43a3b36ac6f7b895"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"59cb20fc0e7ae1aa65fae5cdf0fefd38bcbc83da","unresolved":false,"context_lines":[{"line_number":6219,"context_line":"            for physnet in CONF.neutron.physnets:"},{"line_number":6220,"context_line":"                group \u003d getattr(CONF, \u0027neutron_physnet_%s\u0027 % physnet)"},{"line_number":6221,"context_line":""},{"line_number":6222,"context_line":"                if not group.numa_nodes:"},{"line_number":6223,"context_line":"                    continue"},{"line_number":6224,"context_line":""},{"line_number":6225,"context_line":"                for node in group.numa_nodes:"},{"line_number":6226,"context_line":"                    if node not in affinities:"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_a87e8367","line":6223,"range":{"start_line":6222,"start_character":0,"end_line":6223,"end_character":28},"in_reply_to":"5f7c97a3_9520a0f9","updated":"2018-06-08 14:21:08.000000000","message":"Hmm, good point. This should probably raise an exception, I imagine?","commit_id":"06532915e422e45a10380eae43a3b36ac6f7b895"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"58b952b8185d698de99a01af7c8685a96a937738","unresolved":false,"context_lines":[{"line_number":6219,"context_line":"            for physnet in CONF.neutron.physnets:"},{"line_number":6220,"context_line":"                group \u003d getattr(CONF, \u0027neutron_physnet_%s\u0027 % physnet)"},{"line_number":6221,"context_line":""},{"line_number":6222,"context_line":"                if not group.numa_nodes:"},{"line_number":6223,"context_line":"                    continue"},{"line_number":6224,"context_line":""},{"line_number":6225,"context_line":"                for node in group.numa_nodes:"},{"line_number":6226,"context_line":"                    if node not in affinities:"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_2897d347","line":6223,"range":{"start_line":6222,"start_character":0,"end_line":6223,"end_character":28},"in_reply_to":"5f7c97a3_a87e8367","updated":"2018-06-08 14:31:27.000000000","message":"Yes that was my first feeling but perhaps you have concluded something else in the spec that I missed.","commit_id":"06532915e422e45a10380eae43a3b36ac6f7b895"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"78235dee83cba4073b058c72e7fe0304de55a2e4","unresolved":false,"context_lines":[{"line_number":6274,"context_line":"                        self, cell.id, pages.size))"},{"line_number":6275,"context_line":"                for pages in cell.mempages]"},{"line_number":6276,"context_line":""},{"line_number":6277,"context_line":"            network_info \u003d objects.NUMANetworkInfo("},{"line_number":6278,"context_line":"                physnets\u003dphysnet_affinities[cell.id],"},{"line_number":6279,"context_line":"                tunnel\u003dtunnel_affinities[cell.id])"},{"line_number":6280,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_b5159ce7","line":6277,"updated":"2018-06-07 13:32:05.000000000","message":"Hum... we already use the network_info name it would have been better to find an other one to refer that part","commit_id":"06532915e422e45a10380eae43a3b36ac6f7b895"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"58b952b8185d698de99a01af7c8685a96a937738","unresolved":false,"context_lines":[{"line_number":6274,"context_line":"                        self, cell.id, pages.size))"},{"line_number":6275,"context_line":"                for pages in cell.mempages]"},{"line_number":6276,"context_line":""},{"line_number":6277,"context_line":"            network_info \u003d objects.NUMANetworkInfo("},{"line_number":6278,"context_line":"                physnets\u003dphysnet_affinities[cell.id],"},{"line_number":6279,"context_line":"                tunnel\u003dtunnel_affinities[cell.id])"},{"line_number":6280,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_e88ebb2c","line":6277,"in_reply_to":"5f7c97a3_28b11345","updated":"2018-06-08 14:31:27.000000000","message":":)","commit_id":"06532915e422e45a10380eae43a3b36ac6f7b895"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"59cb20fc0e7ae1aa65fae5cdf0fefd38bcbc83da","unresolved":false,"context_lines":[{"line_number":6274,"context_line":"                        self, cell.id, pages.size))"},{"line_number":6275,"context_line":"                for pages in cell.mempages]"},{"line_number":6276,"context_line":""},{"line_number":6277,"context_line":"            network_info \u003d objects.NUMANetworkInfo("},{"line_number":6278,"context_line":"                physnets\u003dphysnet_affinities[cell.id],"},{"line_number":6279,"context_line":"                tunnel\u003dtunnel_affinities[cell.id])"},{"line_number":6280,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_28b11345","line":6277,"in_reply_to":"5f7c97a3_b5159ce7","updated":"2018-06-08 14:21:08.000000000","message":"You can blame jaypipes for this one. I was just doing as I was told :)","commit_id":"06532915e422e45a10380eae43a3b36ac6f7b895"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"a4dc773ef00aa898ca4255ea31a535d458e1a586","unresolved":false,"context_lines":[{"line_number":6219,"context_line":"            for physnet in CONF.neutron.physnets:"},{"line_number":6220,"context_line":"                group \u003d getattr(CONF, \u0027neutron_physnet_%s\u0027 % physnet)"},{"line_number":6221,"context_line":""},{"line_number":6222,"context_line":"                if not group.numa_nodes:"},{"line_number":6223,"context_line":"                    continue"},{"line_number":6224,"context_line":""},{"line_number":6225,"context_line":"                for node in group.numa_nodes:"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_9517fb46","line":6222,"updated":"2018-06-11 15:27:38.000000000","message":"Stephen You need to raise an exception here. It does not make sense to define a network without indicated what NUMA nodes are used for the PMDs. It\u0027s the whole purpose of that serie.","commit_id":"e39d34510455c86a64747c50a81e34d8bcea0731"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"f40bda46157b69dec30a154ad65951f3385abd87","unresolved":false,"context_lines":[{"line_number":6219,"context_line":"            for physnet in CONF.neutron.physnets:"},{"line_number":6220,"context_line":"                group \u003d getattr(CONF, \u0027neutron_physnet_%s\u0027 % physnet)"},{"line_number":6221,"context_line":""},{"line_number":6222,"context_line":"                if not group.numa_nodes:"},{"line_number":6223,"context_line":"                    continue"},{"line_number":6224,"context_line":""},{"line_number":6225,"context_line":"                for node in group.numa_nodes:"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_78a2fdaf","line":6222,"in_reply_to":"5f7c97a3_32d027c8","updated":"2018-06-14 16:39:15.000000000","message":"Eh, I\u0027m going to raise an exception. I personally agree that we should and it\u0027s easier remove the exception than add one at a later date.","commit_id":"e39d34510455c86a64747c50a81e34d8bcea0731"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"e5fdc81128029b7b662eebeb2be04a3f45245700","unresolved":false,"context_lines":[{"line_number":6219,"context_line":"            for physnet in CONF.neutron.physnets:"},{"line_number":6220,"context_line":"                group \u003d getattr(CONF, \u0027neutron_physnet_%s\u0027 % physnet)"},{"line_number":6221,"context_line":""},{"line_number":6222,"context_line":"                if not group.numa_nodes:"},{"line_number":6223,"context_line":"                    continue"},{"line_number":6224,"context_line":""},{"line_number":6225,"context_line":"                for node in group.numa_nodes:"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_32d027c8","line":6222,"in_reply_to":"5f7c97a3_3c0d5e8e","updated":"2018-06-14 14:55:57.000000000","message":"Right now I would say that does not make sense so that will probably be a mistake from the operator. My thinking is we should at least log something. Sounds reasonable?","commit_id":"e39d34510455c86a64747c50a81e34d8bcea0731"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"b374302cef5ad01e6eb5673ba7861c89a2794a9d","unresolved":false,"context_lines":[{"line_number":6219,"context_line":"            for physnet in CONF.neutron.physnets:"},{"line_number":6220,"context_line":"                group \u003d getattr(CONF, \u0027neutron_physnet_%s\u0027 % physnet)"},{"line_number":6221,"context_line":""},{"line_number":6222,"context_line":"                if not group.numa_nodes:"},{"line_number":6223,"context_line":"                    continue"},{"line_number":6224,"context_line":""},{"line_number":6225,"context_line":"                for node in group.numa_nodes:"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_3c0d5e8e","line":6222,"in_reply_to":"5f7c97a3_4699b76a","updated":"2018-06-14 13:39:38.000000000","message":"I forgot to do this in the last revision and haven\u0027t done it in the next one per Dan\u0027s comments. I could go either direction here though","commit_id":"e39d34510455c86a64747c50a81e34d8bcea0731"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"1d5f1c3ad641d0dab9ab37835ee12b142067ceda","unresolved":false,"context_lines":[{"line_number":6219,"context_line":"            for physnet in CONF.neutron.physnets:"},{"line_number":6220,"context_line":"                group \u003d getattr(CONF, \u0027neutron_physnet_%s\u0027 % physnet)"},{"line_number":6221,"context_line":""},{"line_number":6222,"context_line":"                if not group.numa_nodes:"},{"line_number":6223,"context_line":"                    continue"},{"line_number":6224,"context_line":""},{"line_number":6225,"context_line":"                for node in group.numa_nodes:"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_4699b76a","line":6222,"in_reply_to":"5f7c97a3_9517fb46","updated":"2018-06-11 17:37:20.000000000","message":"I dunno, I can see skipping this if they define the physnet but don\u0027t define the affinities. In the future, we may have different properties of physnets and not care about the numa affinity.","commit_id":"e39d34510455c86a64747c50a81e34d8bcea0731"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"1d5f1c3ad641d0dab9ab37835ee12b142067ceda","unresolved":false,"context_lines":[{"line_number":6236,"context_line":"            affinities \u003d {cell.id: False for cell in topology.cells}"},{"line_number":6237,"context_line":""},{"line_number":6238,"context_line":"            # NOTE(stephenfin): Here for unit test expediency. This will always"},{"line_number":6239,"context_line":"            # be registered by the compute service"},{"line_number":6240,"context_line":"            if \u0027neutron_tunnel\u0027 not in CONF:"},{"line_number":6241,"context_line":"                return affinities"},{"line_number":6242,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_46e777e4","line":6239,"updated":"2018-06-11 17:37:20.000000000","message":"Bzzt. I think you should just make sure you\u0027ve imported the things you need in the unit test so it gets registered :)","commit_id":"e39d34510455c86a64747c50a81e34d8bcea0731"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"b374302cef5ad01e6eb5673ba7861c89a2794a9d","unresolved":false,"context_lines":[{"line_number":6236,"context_line":"            affinities \u003d {cell.id: False for cell in topology.cells}"},{"line_number":6237,"context_line":""},{"line_number":6238,"context_line":"            # NOTE(stephenfin): Here for unit test expediency. This will always"},{"line_number":6239,"context_line":"            # be registered by the compute service"},{"line_number":6240,"context_line":"            if \u0027neutron_tunnel\u0027 not in CONF:"},{"line_number":6241,"context_line":"                return affinities"},{"line_number":6242,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_bcf40e56","line":6239,"in_reply_to":"5f7c97a3_46e777e4","updated":"2018-06-14 13:39:38.000000000","message":"Are you sure? The compute driver will init this on startup but if I remove this line then every unit test which somehow calls this function (which is a lot of them) will start failing. I can fix this by either mocking out the entire function or manually calling the config init function in each of these tests. Both are long winded and ultimately unnecessary, given that I do add tests to verify behavior with these options set in the next patch.\n\nAlso, mriedem totally did this first therefore it\u0027s permissible :) https://github.com/openstack/nova/blob/a1e01a2/nova/compute/api.py#L1480-L1482","commit_id":"e39d34510455c86a64747c50a81e34d8bcea0731"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"f40bda46157b69dec30a154ad65951f3385abd87","unresolved":false,"context_lines":[{"line_number":6236,"context_line":"            affinities \u003d {cell.id: False for cell in topology.cells}"},{"line_number":6237,"context_line":""},{"line_number":6238,"context_line":"            # NOTE(stephenfin): Here for unit test expediency. This will always"},{"line_number":6239,"context_line":"            # be registered by the compute service"},{"line_number":6240,"context_line":"            if \u0027neutron_tunnel\u0027 not in CONF:"},{"line_number":6241,"context_line":"                return affinities"},{"line_number":6242,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_98c5995f","line":6239,"in_reply_to":"5f7c97a3_6d2b1e81","updated":"2018-06-14 16:39:15.000000000","message":"\u003e That example is quite different from checking to see if config is\n \u003e complete, IMHO. This code will never fail if we were to remove that\n \u003e thing from config in the future.\n\nYeah, that\u0027s a valid point, but...\n\n \u003e Which thing doesn\u0027t get imported/registered until compute starts\n \u003e that you run over with this? I feel pretty sure we should be able\n \u003e to resolve this the right way. If we end up with lots of these\n \u003e special for-test-only cases everywhere, things get really\n \u003e unmanageable, and we lose confidence that we\u0027re actually testing\n \u003e the runtime code.\n\nWe need to call \u0027nova.conf.neutron.register_dynamic_opts\u0027, which was added in the previous change. However, we do that in new tests in \u0027nova/tests/unit/virt/libvirt/test_driver.py\u0027. If we removed the configuration option, those tests would start failing. I still don\u0027t think changing this is necessary and the NOTE is there merely as a precaution, as with mriedem\u0027s change above.","commit_id":"e39d34510455c86a64747c50a81e34d8bcea0731"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"0f1e0560ea4af9605d3b8156f1e574a8ff4850ea","unresolved":false,"context_lines":[{"line_number":6236,"context_line":"            affinities \u003d {cell.id: False for cell in topology.cells}"},{"line_number":6237,"context_line":""},{"line_number":6238,"context_line":"            # NOTE(stephenfin): Here for unit test expediency. This will always"},{"line_number":6239,"context_line":"            # be registered by the compute service"},{"line_number":6240,"context_line":"            if \u0027neutron_tunnel\u0027 not in CONF:"},{"line_number":6241,"context_line":"                return affinities"},{"line_number":6242,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_9e7ca1b7","line":6239,"in_reply_to":"5f7c97a3_98c5995f","updated":"2018-06-14 18:30:27.000000000","message":"The register_dynamic_opts thing should just be in test.py. Any test might tickle code that runs through there.","commit_id":"e39d34510455c86a64747c50a81e34d8bcea0731"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cf3f43971e90b34da1f6525b8524d3d8d1e3bb49","unresolved":false,"context_lines":[{"line_number":6236,"context_line":"            affinities \u003d {cell.id: False for cell in topology.cells}"},{"line_number":6237,"context_line":""},{"line_number":6238,"context_line":"            # NOTE(stephenfin): Here for unit test expediency. This will always"},{"line_number":6239,"context_line":"            # be registered by the compute service"},{"line_number":6240,"context_line":"            if \u0027neutron_tunnel\u0027 not in CONF:"},{"line_number":6241,"context_line":"                return affinities"},{"line_number":6242,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_4d7662a6","line":6239,"in_reply_to":"5f7c97a3_bcf40e56","updated":"2018-06-14 15:05:25.000000000","message":"\u003e Also, mriedem totally did this first therefore it\u0027s permissible :) https://github.com/openstack/nova/blob/a1e01a2/nova/compute/api.py#L1480-L1482\n\nYou might want to look at what I did before you call it out as a blessed approach:\n\n762e3d53788f2b146176ef9e521d905134388aae\n\nApparently I was wondering \"wtf is this checking None when this can\u0027t be None\" and added a comment to that effect for other maintainers of that code.","commit_id":"e39d34510455c86a64747c50a81e34d8bcea0731"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"f3b211cb0ede8afc16caeb1f04a2ae0ff08018c1","unresolved":false,"context_lines":[{"line_number":6236,"context_line":"            affinities \u003d {cell.id: False for cell in topology.cells}"},{"line_number":6237,"context_line":""},{"line_number":6238,"context_line":"            # NOTE(stephenfin): Here for unit test expediency. This will always"},{"line_number":6239,"context_line":"            # be registered by the compute service"},{"line_number":6240,"context_line":"            if \u0027neutron_tunnel\u0027 not in CONF:"},{"line_number":6241,"context_line":"                return affinities"},{"line_number":6242,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_6d2b1e81","line":6239,"in_reply_to":"5f7c97a3_bcf40e56","updated":"2018-06-14 15:06:58.000000000","message":"That example is quite different from checking to see if config is complete, IMHO. This code will never fail if we were to remove that thing from config in the future.\n\nWhich thing doesn\u0027t get imported/registered until compute starts that you run over with this? I feel pretty sure we should be able to resolve this the right way. If we end up with lots of these special for-test-only cases everywhere, things get really unmanageable, and we lose confidence that we\u0027re actually testing the runtime code.","commit_id":"e39d34510455c86a64747c50a81e34d8bcea0731"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"dba44aee798c8f94f720f38ef7026f9c8ffbefa8","unresolved":false,"context_lines":[{"line_number":6280,"context_line":"            cell \u003d self._reserved_hugepages.get(cell_id, {})"},{"line_number":6281,"context_line":"            return cell.get(page_size, 0)"},{"line_number":6282,"context_line":""},{"line_number":6283,"context_line":"        def _get_physnet_numa_affinity():"},{"line_number":6284,"context_line":"            affinities \u003d {cell.id: [] for cell in topology.cells}"},{"line_number":6285,"context_line":"            for physnet in CONF.neutron.physnets:"},{"line_number":6286,"context_line":"                group \u003d getattr(CONF, \u0027neutron_physnet_%s\u0027 % physnet)"},{"line_number":6287,"context_line":""},{"line_number":6288,"context_line":"                if not group.numa_nodes:"},{"line_number":6289,"context_line":"                    msg \u003d (\"the physnet was listed in \u0027[neutron] physnets\u0027 \""},{"line_number":6290,"context_line":"                           \"but no corresponding \u0027neutron_physnet_%s\u0027 \""},{"line_number":6291,"context_line":"                           \"section was defined.\" % physnet)"},{"line_number":6292,"context_line":"                    raise exception.InvalidNetworkNUMAAffinity(reason\u003dmsg)"},{"line_number":6293,"context_line":""},{"line_number":6294,"context_line":"                for node in group.numa_nodes:"},{"line_number":6295,"context_line":"                    if node not in affinities:"},{"line_number":6296,"context_line":"                        msg \u003d (\"node %d for physnet %s is not present in host \""},{"line_number":6297,"context_line":"                               \"affinity set %r\" % (node, physnet, affinities))"},{"line_number":6298,"context_line":"                        # The referenced an invalid node"},{"line_number":6299,"context_line":"                        raise exception.InvalidNetworkNUMAAffinity(reason\u003dmsg)"},{"line_number":6300,"context_line":"                    affinities[node].append(physnet)"},{"line_number":6301,"context_line":""},{"line_number":6302,"context_line":"            return affinities"},{"line_number":6303,"context_line":""},{"line_number":6304,"context_line":"        def _get_tunnel_numa_affinity():"},{"line_number":6305,"context_line":"            affinities \u003d {cell.id: False for cell in topology.cells}"},{"line_number":6306,"context_line":""},{"line_number":6307,"context_line":"            for node in CONF.neutron_tunnel.numa_nodes:"},{"line_number":6308,"context_line":"                if node not in affinities:"},{"line_number":6309,"context_line":"                    msg \u003d (\"node %d for tunneled networks is not present \""},{"line_number":6310,"context_line":"                           \"in host affinity set %r\" % (node, affinities))"},{"line_number":6311,"context_line":"                    # The referenced an invalid node"},{"line_number":6312,"context_line":"                    raise exception.InvalidNetworkNUMAAffinity(reason\u003dmsg)"},{"line_number":6313,"context_line":"                affinities[node] \u003d True"},{"line_number":6314,"context_line":""},{"line_number":6315,"context_line":"            return affinities"},{"line_number":6316,"context_line":""},{"line_number":6317,"context_line":"        physnet_affinities \u003d _get_physnet_numa_affinity()"},{"line_number":6318,"context_line":"        tunnel_affinities \u003d _get_tunnel_numa_affinity()"}],"source_content_type":"text/x-python","patch_set":13,"id":"5f7c97a3_b10454c7","line":6315,"range":{"start_line":6283,"start_character":0,"end_line":6315,"end_character":29},"updated":"2018-06-26 12:05:04.000000000","message":"Nothing here are really libvirt specific, right? What about to put all of that in hardware.py so all virt drivers can use this logic","commit_id":"bbc6835c0366d1137c378710d677df3918454748"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bed8181a0e0107adb53a3578caed7e06f700d656","unresolved":false,"context_lines":[{"line_number":6280,"context_line":"            cell \u003d self._reserved_hugepages.get(cell_id, {})"},{"line_number":6281,"context_line":"            return cell.get(page_size, 0)"},{"line_number":6282,"context_line":""},{"line_number":6283,"context_line":"        def _get_physnet_numa_affinity():"},{"line_number":6284,"context_line":"            affinities \u003d {cell.id: [] for cell in topology.cells}"},{"line_number":6285,"context_line":"            for physnet in CONF.neutron.physnets:"},{"line_number":6286,"context_line":"                group \u003d getattr(CONF, \u0027neutron_physnet_%s\u0027 % physnet)"},{"line_number":6287,"context_line":""},{"line_number":6288,"context_line":"                if not group.numa_nodes:"},{"line_number":6289,"context_line":"                    msg \u003d (\"the physnet was listed in \u0027[neutron] physnets\u0027 \""},{"line_number":6290,"context_line":"                           \"but no corresponding \u0027neutron_physnet_%s\u0027 \""},{"line_number":6291,"context_line":"                           \"section was defined.\" % physnet)"},{"line_number":6292,"context_line":"                    raise exception.InvalidNetworkNUMAAffinity(reason\u003dmsg)"},{"line_number":6293,"context_line":""},{"line_number":6294,"context_line":"                for node in group.numa_nodes:"},{"line_number":6295,"context_line":"                    if node not in affinities:"},{"line_number":6296,"context_line":"                        msg \u003d (\"node %d for physnet %s is not present in host \""},{"line_number":6297,"context_line":"                               \"affinity set %r\" % (node, physnet, affinities))"},{"line_number":6298,"context_line":"                        # The referenced an invalid node"},{"line_number":6299,"context_line":"                        raise exception.InvalidNetworkNUMAAffinity(reason\u003dmsg)"},{"line_number":6300,"context_line":"                    affinities[node].append(physnet)"},{"line_number":6301,"context_line":""},{"line_number":6302,"context_line":"            return affinities"},{"line_number":6303,"context_line":""},{"line_number":6304,"context_line":"        def _get_tunnel_numa_affinity():"},{"line_number":6305,"context_line":"            affinities \u003d {cell.id: False for cell in topology.cells}"},{"line_number":6306,"context_line":""},{"line_number":6307,"context_line":"            for node in CONF.neutron_tunnel.numa_nodes:"},{"line_number":6308,"context_line":"                if node not in affinities:"},{"line_number":6309,"context_line":"                    msg \u003d (\"node %d for tunneled networks is not present \""},{"line_number":6310,"context_line":"                           \"in host affinity set %r\" % (node, affinities))"},{"line_number":6311,"context_line":"                    # The referenced an invalid node"},{"line_number":6312,"context_line":"                    raise exception.InvalidNetworkNUMAAffinity(reason\u003dmsg)"},{"line_number":6313,"context_line":"                affinities[node] \u003d True"},{"line_number":6314,"context_line":""},{"line_number":6315,"context_line":"            return affinities"},{"line_number":6316,"context_line":""},{"line_number":6317,"context_line":"        physnet_affinities \u003d _get_physnet_numa_affinity()"},{"line_number":6318,"context_line":"        tunnel_affinities \u003d _get_tunnel_numa_affinity()"}],"source_content_type":"text/x-python","patch_set":13,"id":"5f7c97a3_c005747b","line":6315,"range":{"start_line":6283,"start_character":0,"end_line":6315,"end_character":29},"in_reply_to":"5f7c97a3_b10454c7","updated":"2018-07-19 16:53:17.000000000","message":"That\u0027s a good point. I can move this.","commit_id":"bbc6835c0366d1137c378710d677df3918454748"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"43fd80761bb7c93c8bfa13660ae3b36b5c102d7c","unresolved":false,"context_lines":[{"line_number":6255,"context_line":""},{"line_number":6256,"context_line":"        return False"},{"line_number":6257,"context_line":""},{"line_number":6258,"context_line":"    def _get_host_numa_topology(self):"},{"line_number":6259,"context_line":"        if not self._has_numa_support():"},{"line_number":6260,"context_line":"            return"},{"line_number":6261,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"5f7c97a3_64012639","line":6258,"range":{"start_line":6258,"start_character":8,"end_line":6258,"end_character":31},"updated":"2018-07-19 16:43:08.000000000","message":"General nit: I tend to think the plethora of internal methods in here is an anti-pattern and makes it harder to read/maintain. I know you\u0027re following a pattern, but....\n\nIt\u0027s something for which we killed the vmware driver spawn() method years ago because it was like 500 LOC full of inner methods.","commit_id":"843aff2e602d13d9cc5d72e76e81499e9f8b8ce5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3a3a11711fb175741b24a95907b889e967612830","unresolved":false,"context_lines":[{"line_number":6255,"context_line":""},{"line_number":6256,"context_line":"        return False"},{"line_number":6257,"context_line":""},{"line_number":6258,"context_line":"    def _get_host_numa_topology(self):"},{"line_number":6259,"context_line":"        if not self._has_numa_support():"},{"line_number":6260,"context_line":"            return"},{"line_number":6261,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"5f7c97a3_8f1b3b6d","line":6258,"range":{"start_line":6258,"start_character":8,"end_line":6258,"end_character":31},"in_reply_to":"5f7c97a3_64012639","updated":"2018-07-19 16:44:14.000000000","message":"BTW, don\u0027t feel the need to change it in this change - I\u0027m just expressing a style preference. Some others like it this way.","commit_id":"843aff2e602d13d9cc5d72e76e81499e9f8b8ce5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"43fd80761bb7c93c8bfa13660ae3b36b5c102d7c","unresolved":false,"context_lines":[{"line_number":6280,"context_line":"        def _get_physnet_numa_affinity():"},{"line_number":6281,"context_line":"            affinities \u003d {cell.id: set() for cell in topology.cells}"},{"line_number":6282,"context_line":"            for physnet in CONF.neutron.physnets:"},{"line_number":6283,"context_line":"                group \u003d getattr(CONF, \u0027neutron_physnet_%s\u0027 % physnet)"},{"line_number":6284,"context_line":""},{"line_number":6285,"context_line":"                if not group.numa_nodes:"},{"line_number":6286,"context_line":"                    msg \u003d (\"the physnet was listed in \u0027[neutron] physnets\u0027 \""}],"source_content_type":"text/x-python","patch_set":24,"id":"5f7c97a3_247a4eba","line":6283,"range":{"start_line":6283,"start_character":16,"end_line":6283,"end_character":69},"updated":"2018-07-19 16:43:08.000000000","message":"What happens if the group itself is not defined? Would we get a NoneType error blow on group.numa_nodes?","commit_id":"843aff2e602d13d9cc5d72e76e81499e9f8b8ce5"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bed8181a0e0107adb53a3578caed7e06f700d656","unresolved":false,"context_lines":[{"line_number":6280,"context_line":"        def _get_physnet_numa_affinity():"},{"line_number":6281,"context_line":"            affinities \u003d {cell.id: set() for cell in topology.cells}"},{"line_number":6282,"context_line":"            for physnet in CONF.neutron.physnets:"},{"line_number":6283,"context_line":"                group \u003d getattr(CONF, \u0027neutron_physnet_%s\u0027 % physnet)"},{"line_number":6284,"context_line":""},{"line_number":6285,"context_line":"                if not group.numa_nodes:"},{"line_number":6286,"context_line":"                    msg \u003d (\"the physnet was listed in \u0027[neutron] physnets\u0027 \""}],"source_content_type":"text/x-python","patch_set":24,"id":"5f7c97a3_6f625fdb","line":6283,"range":{"start_line":6283,"start_character":16,"end_line":6283,"end_character":69},"in_reply_to":"5f7c97a3_247a4eba","updated":"2018-07-19 16:53:17.000000000","message":"Yeah, this will error out. That\u0027s what we want because it\u0027s a bug if it\u0027s not registered","commit_id":"843aff2e602d13d9cc5d72e76e81499e9f8b8ce5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"43fd80761bb7c93c8bfa13660ae3b36b5c102d7c","unresolved":false,"context_lines":[{"line_number":6284,"context_line":""},{"line_number":6285,"context_line":"                if not group.numa_nodes:"},{"line_number":6286,"context_line":"                    msg \u003d (\"the physnet was listed in \u0027[neutron] physnets\u0027 \""},{"line_number":6287,"context_line":"                           \"but no corresponding \u0027neutron_physnet_%s\u0027 \""},{"line_number":6288,"context_line":"                           \"section was defined.\" % physnet)"},{"line_number":6289,"context_line":"                    raise exception.InvalidNetworkNUMAAffinity(reason\u003dmsg)"},{"line_number":6290,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"5f7c97a3_84580257","line":6287,"range":{"start_line":6287,"start_character":50,"end_line":6287,"end_character":66},"updated":"2018-07-19 16:43:08.000000000","message":"Isn\u0027t the failure to define the numa_nodes option within the group, not the group itself? If the group isn\u0027t defined, then don\u0027t we get an error before this?","commit_id":"843aff2e602d13d9cc5d72e76e81499e9f8b8ce5"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bed8181a0e0107adb53a3578caed7e06f700d656","unresolved":false,"context_lines":[{"line_number":6284,"context_line":""},{"line_number":6285,"context_line":"                if not group.numa_nodes:"},{"line_number":6286,"context_line":"                    msg \u003d (\"the physnet was listed in \u0027[neutron] physnets\u0027 \""},{"line_number":6287,"context_line":"                           \"but no corresponding \u0027neutron_physnet_%s\u0027 \""},{"line_number":6288,"context_line":"                           \"section was defined.\" % physnet)"},{"line_number":6289,"context_line":"                    raise exception.InvalidNetworkNUMAAffinity(reason\u003dmsg)"},{"line_number":6290,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"5f7c97a3_2f58e722","line":6287,"range":{"start_line":6287,"start_character":50,"end_line":6287,"end_character":66},"in_reply_to":"5f7c97a3_84580257","updated":"2018-07-19 16:53:17.000000000","message":"Good point. I\u0027ll update","commit_id":"843aff2e602d13d9cc5d72e76e81499e9f8b8ce5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"43fd80761bb7c93c8bfa13660ae3b36b5c102d7c","unresolved":false,"context_lines":[{"line_number":6292,"context_line":"                    if node not in affinities:"},{"line_number":6293,"context_line":"                        msg \u003d (\"node %d for physnet %s is not present in host \""},{"line_number":6294,"context_line":"                               \"affinity set %r\" % (node, physnet, affinities))"},{"line_number":6295,"context_line":"                        # The referenced an invalid node"},{"line_number":6296,"context_line":"                        raise exception.InvalidNetworkNUMAAffinity(reason\u003dmsg)"},{"line_number":6297,"context_line":"                    affinities[node].add(physnet)"},{"line_number":6298,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"5f7c97a3_642286bc","line":6295,"range":{"start_line":6295,"start_character":26,"end_line":6295,"end_character":29},"updated":"2018-07-19 16:43:08.000000000","message":"The config? They referenced?","commit_id":"843aff2e602d13d9cc5d72e76e81499e9f8b8ce5"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bed8181a0e0107adb53a3578caed7e06f700d656","unresolved":false,"context_lines":[{"line_number":6292,"context_line":"                    if node not in affinities:"},{"line_number":6293,"context_line":"                        msg \u003d (\"node %d for physnet %s is not present in host \""},{"line_number":6294,"context_line":"                               \"affinity set %r\" % (node, physnet, affinities))"},{"line_number":6295,"context_line":"                        # The referenced an invalid node"},{"line_number":6296,"context_line":"                        raise exception.InvalidNetworkNUMAAffinity(reason\u003dmsg)"},{"line_number":6297,"context_line":"                    affinities[node].add(physnet)"},{"line_number":6298,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"5f7c97a3_cf9853cd","line":6295,"range":{"start_line":6295,"start_character":26,"end_line":6295,"end_character":29},"in_reply_to":"5f7c97a3_642286bc","updated":"2018-07-19 16:53:17.000000000","message":"The config","commit_id":"843aff2e602d13d9cc5d72e76e81499e9f8b8ce5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"43fd80761bb7c93c8bfa13660ae3b36b5c102d7c","unresolved":false,"context_lines":[{"line_number":6301,"context_line":"        def _get_tunnel_numa_affinity():"},{"line_number":6302,"context_line":"            affinities \u003d {cell.id: False for cell in topology.cells}"},{"line_number":6303,"context_line":""},{"line_number":6304,"context_line":"            for node in CONF.neutron_tunnel.numa_nodes:"},{"line_number":6305,"context_line":"                if node not in affinities:"},{"line_number":6306,"context_line":"                    msg \u003d (\"node %d for tunneled networks is not present \""},{"line_number":6307,"context_line":"                           \"in host affinity set %r\" % (node, affinities))"}],"source_content_type":"text/x-python","patch_set":24,"id":"5f7c97a3_4f10c34f","line":6304,"range":{"start_line":6304,"start_character":24,"end_line":6304,"end_character":54},"updated":"2018-07-19 16:43:08.000000000","message":"What if this config isn\u0027t set?","commit_id":"843aff2e602d13d9cc5d72e76e81499e9f8b8ce5"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bed8181a0e0107adb53a3578caed7e06f700d656","unresolved":false,"context_lines":[{"line_number":6301,"context_line":"        def _get_tunnel_numa_affinity():"},{"line_number":6302,"context_line":"            affinities \u003d {cell.id: False for cell in topology.cells}"},{"line_number":6303,"context_line":""},{"line_number":6304,"context_line":"            for node in CONF.neutron_tunnel.numa_nodes:"},{"line_number":6305,"context_line":"                if node not in affinities:"},{"line_number":6306,"context_line":"                    msg \u003d (\"node %d for tunneled networks is not present \""},{"line_number":6307,"context_line":"                           \"in host affinity set %r\" % (node, affinities))"}],"source_content_type":"text/x-python","patch_set":24,"id":"5f7c97a3_ef374fae","line":6304,"range":{"start_line":6304,"start_character":24,"end_line":6304,"end_character":54},"in_reply_to":"5f7c97a3_4f10c34f","updated":"2018-07-19 16:53:17.000000000","message":"It\u0027ll happily do nothing. That\u0027s ok because, unlike physnets, we don\u0027t have a separate thing that says \"I need NUMA affinity for these physnets\" (which is what defining \u0027[neutron] physnets\u0027 will do). Instead, defining this option will say that. We need to keep this optional for people who are upgrading/don\u0027t care about NUMA","commit_id":"843aff2e602d13d9cc5d72e76e81499e9f8b8ce5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"63157955a82303ba463e175b7947464d48ab1116","unresolved":false,"context_lines":[{"line_number":6301,"context_line":"        def _get_tunnel_numa_affinity():"},{"line_number":6302,"context_line":"            affinities \u003d {cell.id: False for cell in topology.cells}"},{"line_number":6303,"context_line":""},{"line_number":6304,"context_line":"            for node in CONF.neutron_tunnel.numa_nodes:"},{"line_number":6305,"context_line":"                if node not in affinities:"},{"line_number":6306,"context_line":"                    msg \u003d (\"node %d for tunneled networks is not present \""},{"line_number":6307,"context_line":"                           \"in host affinity set %r\" % (node, affinities))"}],"source_content_type":"text/x-python","patch_set":24,"id":"5f7c97a3_0f15ebe5","line":6304,"range":{"start_line":6304,"start_character":24,"end_line":6304,"end_character":54},"in_reply_to":"5f7c97a3_6ff1ffdd","updated":"2018-07-19 16:58:47.000000000","message":"Oh I guess that shouldn\u0027t happen since we register and set defaults:\n\nhttps://review.openstack.org/#/c/564440/21/nova/conf/neutron.py@163","commit_id":"843aff2e602d13d9cc5d72e76e81499e9f8b8ce5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"edd6aa73acc9a6e9313ad459a569c298e363751a","unresolved":false,"context_lines":[{"line_number":6301,"context_line":"        def _get_tunnel_numa_affinity():"},{"line_number":6302,"context_line":"            affinities \u003d {cell.id: False for cell in topology.cells}"},{"line_number":6303,"context_line":""},{"line_number":6304,"context_line":"            for node in CONF.neutron_tunnel.numa_nodes:"},{"line_number":6305,"context_line":"                if node not in affinities:"},{"line_number":6306,"context_line":"                    msg \u003d (\"node %d for tunneled networks is not present \""},{"line_number":6307,"context_line":"                           \"in host affinity set %r\" % (node, affinities))"}],"source_content_type":"text/x-python","patch_set":24,"id":"5f7c97a3_6ff1ffdd","line":6304,"range":{"start_line":6304,"start_character":24,"end_line":6304,"end_character":54},"in_reply_to":"5f7c97a3_ef374fae","updated":"2018-07-19 16:57:42.000000000","message":"But I mean, what if [neutron_tunnel] isn\u0027t in config - won\u0027t that be an error if we try to access the numa_nodes config option in that group?","commit_id":"843aff2e602d13d9cc5d72e76e81499e9f8b8ce5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"43fd80761bb7c93c8bfa13660ae3b36b5c102d7c","unresolved":false,"context_lines":[{"line_number":6305,"context_line":"                if node not in affinities:"},{"line_number":6306,"context_line":"                    msg \u003d (\"node %d for tunneled networks is not present \""},{"line_number":6307,"context_line":"                           \"in host affinity set %r\" % (node, affinities))"},{"line_number":6308,"context_line":"                    # The referenced an invalid node"},{"line_number":6309,"context_line":"                    raise exception.InvalidNetworkNUMAAffinity(reason\u003dmsg)"},{"line_number":6310,"context_line":"                affinities[node] \u003d True"},{"line_number":6311,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"5f7c97a3_6f0b3f21","line":6308,"range":{"start_line":6308,"start_character":22,"end_line":6308,"end_character":25},"updated":"2018-07-19 16:43:08.000000000","message":"same as above","commit_id":"843aff2e602d13d9cc5d72e76e81499e9f8b8ce5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e389f919d824e81704116a58d386fe5e7e5386d9","unresolved":false,"context_lines":[{"line_number":6280,"context_line":"        def _get_physnet_numa_affinity():"},{"line_number":6281,"context_line":"            affinities \u003d {cell.id: set() for cell in topology.cells}"},{"line_number":6282,"context_line":"            for physnet in CONF.neutron.physnets:"},{"line_number":6283,"context_line":"                # This will error out if the group is not registered, which is"},{"line_number":6284,"context_line":"                # exactly what we want as that would be a bug"},{"line_number":6285,"context_line":"                group \u003d getattr(CONF, \u0027neutron_physnet_%s\u0027 % physnet)"},{"line_number":6286,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"5f7c97a3_c4d33f36","line":6283,"updated":"2018-07-20 14:31:26.000000000","message":"What kind of error? ValueError? Just wondering if we want to trap that and make it a more useful error. Could be a follow up. Could also be something we check on compute startup and fail fast so the compute doesn\u0027t start if it\u0027s misconfigured.","commit_id":"dd04e73f3f117b592fb18080f6ff77ac7f613da2"}]}
