)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":10366,"name":"Hemanth N","email":"hemanth.nakkina@canonical.com","username":"Hemanth"},"change_message_id":"cfbff68a4256c196ae2265f6f1d533f33637f2de","unresolved":true,"context_lines":[{"line_number":18,"context_line":"and filters this list via a list comprehension. While this"},{"line_number":19,"context_line":"implementation is still O(N) the prefactor is significantly smaller."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Closes: https://bugs.launchpad.net/horizon/+bug/1943639"},{"line_number":22,"context_line":"Change-Id: I8fd32c3aad22d8ef7f57201f5144f6b2e357ef10"},{"line_number":23,"context_line":"Signed-off-by: Nicolas Bock \u003cnicolas.bock@canonical.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"8fd91f68_e1453f61","line":21,"range":{"start_line":21,"start_character":0,"end_line":21,"end_character":55},"updated":"2021-09-16 05:23:51.000000000","message":"Use Closes-Bug: #\u003cbug id\u003e [1] so that OpenStack Infra can update Launchpad bug on progress.\n\n[1] https://docs.opendev.org/opendev/infra-manual/latest/developers.html#working-on-bugs","commit_id":"ff4e4158fa80f435d99408becd69c464b1f224f4"},{"author":{"_account_id":19298,"name":"Nicolas Bock","email":"nicolas.bock@canonical.com","username":"nicolasbock"},"change_message_id":"16c1477592c9ffc459e873422ada9639b4217895","unresolved":false,"context_lines":[{"line_number":18,"context_line":"and filters this list via a list comprehension. While this"},{"line_number":19,"context_line":"implementation is still O(N) the prefactor is significantly smaller."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Closes: https://bugs.launchpad.net/horizon/+bug/1943639"},{"line_number":22,"context_line":"Change-Id: I8fd32c3aad22d8ef7f57201f5144f6b2e357ef10"},{"line_number":23,"context_line":"Signed-off-by: Nicolas Bock \u003cnicolas.bock@canonical.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"8e78f157_634e157c","line":21,"range":{"start_line":21,"start_character":0,"end_line":21,"end_character":55},"in_reply_to":"8fd91f68_e1453f61","updated":"2022-02-11 21:41:26.000000000","message":"Ack","commit_id":"ff4e4158fa80f435d99408becd69c464b1f224f4"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"2f6c6d9996d5a2f49f2c98ff17bbf9605fb36fe7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"d95c6ce3_3a2e8511","updated":"2022-02-02 09:51:03.000000000","message":"LGTM","commit_id":"782ed9d52fd86dc771c972a0f8f9ffe7851195d8"},{"author":{"_account_id":10366,"name":"Hemanth N","email":"hemanth.nakkina@canonical.com","username":"Hemanth"},"change_message_id":"34b6c77faca8d16a35a8924a61c1005025c9c5c4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"ebd00207_1e34b485","updated":"2022-01-31 04:04:10.000000000","message":"LGTM!","commit_id":"782ed9d52fd86dc771c972a0f8f9ffe7851195d8"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"37daab68a19a81358332d4b36553ee8ae2daa227","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"2ca1d848_e428b7e2","updated":"2022-02-14 10:55:04.000000000","message":"Thanks for the improvement.\nPlease find my comments to clean up the code.","commit_id":"782ed9d52fd86dc771c972a0f8f9ffe7851195d8"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"f684a34075a55ab88f69bcc903292c736e1e16c8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"8dd6a2e5_4f1bd51b","updated":"2022-02-24 06:47:14.000000000","message":"There is no response from the author, so I am trying to address and update the unit tests.","commit_id":"782ed9d52fd86dc771c972a0f8f9ffe7851195d8"},{"author":{"_account_id":8648,"name":"Radomir Dopieralski","email":"openstack@dopieralski.pl","username":"thesheep"},"change_message_id":"832a14bcc0e00a30d99f9dcdf320b03a24a8c0e3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"8b0e279d_9d0cd0cc","updated":"2022-02-02 10:35:11.000000000","message":"There is one side effect to this change that is not immediately apparent, and I\u0027m not sure if it\u0027s desired. The API limits the number of ports it returns per call, and with a single call retrieving all the ports at once, we are much more likely to hit that limit.","commit_id":"782ed9d52fd86dc771c972a0f8f9ffe7851195d8"},{"author":{"_account_id":8648,"name":"Radomir Dopieralski","email":"openstack@dopieralski.pl","username":"thesheep"},"change_message_id":"cd7a834c68794f8c4f2e5ba6ad9de8d77f16b19f","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":4,"id":"ea087315_80d3b7c4","in_reply_to":"51838e5d_a5b28474","updated":"2022-02-14 13:27:28.000000000","message":"yes","commit_id":"782ed9d52fd86dc771c972a0f8f9ffe7851195d8"},{"author":{"_account_id":19298,"name":"Nicolas Bock","email":"nicolas.bock@canonical.com","username":"nicolasbock"},"change_message_id":"45d762a0f46644c8fbe1588dfa78d10dc0693a58","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":4,"id":"51838e5d_a5b28474","in_reply_to":"8b0e279d_9d0cd0cc","updated":"2022-02-11 21:41:08.000000000","message":"Just to make sure, you are referring to pagination in the Neutron client API?","commit_id":"782ed9d52fd86dc771c972a0f8f9ffe7851195d8"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"adb233859f3fc1512714b1e8c159758505b99c3f","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":4,"id":"139136ef_5a4b81a5","in_reply_to":"ea087315_80d3b7c4","updated":"2022-02-24 07:52:56.000000000","message":"The python binding in python-neutronclient fetches all ports even when all ports exceeds the pagination limit in the server side. It calls the neutron API multiple times. See [1] for detail.\n\n[1] https://opendev.org/openstack/python-neutronclient/src/branch/master/neutronclient/v2_0/client.py#L369-L375","commit_id":"782ed9d52fd86dc771c972a0f8f9ffe7851195d8"},{"author":{"_account_id":19298,"name":"Nicolas Bock","email":"nicolas.bock@canonical.com","username":"nicolasbock"},"change_message_id":"3c27b620236aa8e3fbd66f9d3f43f831eee4ea84","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"47e09abe_cdf74774","updated":"2022-02-25 22:06:32.000000000","message":"Thanks Akihiro for your help!","commit_id":"9f5d659d160d24d359992dda22fecb0db6b6f805"}],"openstack_dashboard/dashboards/project/instances/tests.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"f684a34075a55ab88f69bcc903292c736e1e16c8","unresolved":true,"context_lines":[{"line_number":3010,"context_line":"    def test_interface_attach_get(self):"},{"line_number":3011,"context_line":"        server \u003d self.servers.first()"},{"line_number":3012,"context_line":"        self.mock_network_list_for_tenant.side_effect \u003d ["},{"line_number":3013,"context_line":"            self.networks.list()[:1],"},{"line_number":3014,"context_line":"            [],"},{"line_number":3015,"context_line":"        ]"},{"line_number":3016,"context_line":""},{"line_number":3017,"context_line":"        url \u003d reverse(\u0027horizon:project:instances:attach_interface\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"b2305748_de5136b5","line":3014,"range":{"start_line":3013,"start_character":12,"end_line":3014,"end_character":15},"updated":"2022-02-24 06:47:14.000000000","message":"After more investigation, it turns out that the change in utils.py by this proposal is not tested by this test. It happens due to this tricky return values. As a result, network_list_for_tenant() call in port_field_data returns an empty list of networks and add_more_info_port_name() is not tested expectedly.\n\nI am trying to update the test to cover the change.","commit_id":"782ed9d52fd86dc771c972a0f8f9ffe7851195d8"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"9880d438ef0841e4f898758f48ff1f47cc832f3a","unresolved":false,"context_lines":[{"line_number":3010,"context_line":"    def test_interface_attach_get(self):"},{"line_number":3011,"context_line":"        server \u003d self.servers.first()"},{"line_number":3012,"context_line":"        self.mock_network_list_for_tenant.side_effect \u003d ["},{"line_number":3013,"context_line":"            self.networks.list()[:1],"},{"line_number":3014,"context_line":"            [],"},{"line_number":3015,"context_line":"        ]"},{"line_number":3016,"context_line":""},{"line_number":3017,"context_line":"        url \u003d reverse(\u0027horizon:project:instances:attach_interface\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"a1610768_5929bf60","line":3014,"range":{"start_line":3013,"start_character":12,"end_line":3014,"end_character":15},"in_reply_to":"62baee8c_871a68c6","updated":"2022-02-25 07:19:37.000000000","message":"https://review.opendev.org/c/openstack/horizon/+/830936 adds the test coverage.","commit_id":"782ed9d52fd86dc771c972a0f8f9ffe7851195d8"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"4bd0be396abff3d1a6dcbe6c2525a1e4779d2fe4","unresolved":true,"context_lines":[{"line_number":3010,"context_line":"    def test_interface_attach_get(self):"},{"line_number":3011,"context_line":"        server \u003d self.servers.first()"},{"line_number":3012,"context_line":"        self.mock_network_list_for_tenant.side_effect \u003d ["},{"line_number":3013,"context_line":"            self.networks.list()[:1],"},{"line_number":3014,"context_line":"            [],"},{"line_number":3015,"context_line":"        ]"},{"line_number":3016,"context_line":""},{"line_number":3017,"context_line":"        url \u003d reverse(\u0027horizon:project:instances:attach_interface\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"62baee8c_871a68c6","line":3014,"range":{"start_line":3013,"start_character":12,"end_line":3014,"end_character":15},"in_reply_to":"b2305748_de5136b5","updated":"2022-02-24 07:49:42.000000000","message":"I will add more UT to cover attach_interface by port in a follow-up patch.\nIt needs an unbound port as test data and also adds more assertions to test_attach_interface_get and _post tests. For test data, I would like to check an unbound port can be added to neutron_data.py (which is used in all UTs) or we need to define it in the attach_interface tests explicitly. Considering this, I think it is better to do it as a follow-up.","commit_id":"782ed9d52fd86dc771c972a0f8f9ffe7851195d8"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"37daab68a19a81358332d4b36553ee8ae2daa227","unresolved":true,"context_lines":[{"line_number":3012,"context_line":"        self.mock_network_list_for_tenant.side_effect \u003d ["},{"line_number":3013,"context_line":"            self.networks.list()[:1],"},{"line_number":3014,"context_line":"            [],"},{"line_number":3015,"context_line":"        ]"},{"line_number":3016,"context_line":""},{"line_number":3017,"context_line":"        url \u003d reverse(\u0027horizon:project:instances:attach_interface\u0027,"},{"line_number":3018,"context_line":"                      args\u003d[server.id])"}],"source_content_type":"text/x-python","patch_set":4,"id":"42e82460_b35e09b6","line":3015,"updated":"2022-02-14 10:55:04.000000000","message":"The return_value of mocked port_list_with_trunk_types should be assigned.\nReturning mock.Mock() is not a good idea.","commit_id":"782ed9d52fd86dc771c972a0f8f9ffe7851195d8"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"f684a34075a55ab88f69bcc903292c736e1e16c8","unresolved":false,"context_lines":[{"line_number":3012,"context_line":"        self.mock_network_list_for_tenant.side_effect \u003d ["},{"line_number":3013,"context_line":"            self.networks.list()[:1],"},{"line_number":3014,"context_line":"            [],"},{"line_number":3015,"context_line":"        ]"},{"line_number":3016,"context_line":""},{"line_number":3017,"context_line":"        url \u003d reverse(\u0027horizon:project:instances:attach_interface\u0027,"},{"line_number":3018,"context_line":"                      args\u003d[server.id])"}],"source_content_type":"text/x-python","patch_set":4,"id":"019d97f3_9aea2847","line":3015,"in_reply_to":"42e82460_b35e09b6","updated":"2022-02-24 06:47:14.000000000","message":"Done","commit_id":"782ed9d52fd86dc771c972a0f8f9ffe7851195d8"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"37daab68a19a81358332d4b36553ee8ae2daa227","unresolved":true,"context_lines":[{"line_number":3024,"context_line":"            mock.call(helpers.IsHttpRequest(), self.tenant.id),"},{"line_number":3025,"context_line":"            mock.call(helpers.IsHttpRequest(), self.tenant.id),"},{"line_number":3026,"context_line":"        ])"},{"line_number":3027,"context_line":"        self.assertEqual(2, self.mock_network_list_for_tenant.call_count)"},{"line_number":3028,"context_line":""},{"line_number":3029,"context_line":"    @helpers.create_mocks({api.neutron: (\u0027network_list_for_tenant\u0027,"},{"line_number":3030,"context_line":"                                         \u0027port_list_with_trunk_types\u0027),"}],"source_content_type":"text/x-python","patch_set":4,"id":"909aee10_c5f42a75","line":3027,"updated":"2022-02-14 10:55:04.000000000","message":"The call of self.mock_port_list_with_trunk_types should be asserted.","commit_id":"782ed9d52fd86dc771c972a0f8f9ffe7851195d8"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"f684a34075a55ab88f69bcc903292c736e1e16c8","unresolved":false,"context_lines":[{"line_number":3024,"context_line":"            mock.call(helpers.IsHttpRequest(), self.tenant.id),"},{"line_number":3025,"context_line":"            mock.call(helpers.IsHttpRequest(), self.tenant.id),"},{"line_number":3026,"context_line":"        ])"},{"line_number":3027,"context_line":"        self.assertEqual(2, self.mock_network_list_for_tenant.call_count)"},{"line_number":3028,"context_line":""},{"line_number":3029,"context_line":"    @helpers.create_mocks({api.neutron: (\u0027network_list_for_tenant\u0027,"},{"line_number":3030,"context_line":"                                         \u0027port_list_with_trunk_types\u0027),"}],"source_content_type":"text/x-python","patch_set":4,"id":"9e420552_c265e1a8","line":3027,"in_reply_to":"909aee10_c5f42a75","updated":"2022-02-24 06:47:14.000000000","message":"Done","commit_id":"782ed9d52fd86dc771c972a0f8f9ffe7851195d8"}],"openstack_dashboard/dashboards/project/instances/utils.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"37daab68a19a81358332d4b36553ee8ae2daa227","unresolved":true,"context_lines":[{"line_number":198,"context_line":"                [ip[\u0027ip_address\u0027] for ip in port[\u0027fixed_ips\u0027]]))"},{"line_number":199,"context_line":"        if with_network and network_id:"},{"line_number":200,"context_line":"            port_name +\u003d \" - {}\".format("},{"line_number":201,"context_line":"                [network.name_or_id for network in networks"},{"line_number":202,"context_line":"                 if network.id \u003d\u003d network_id][0])"},{"line_number":203,"context_line":"        return port_name"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"    ports \u003d []"}],"source_content_type":"text/x-python","patch_set":4,"id":"43be5aef_659b35f5","line":202,"range":{"start_line":201,"start_character":16,"end_line":202,"end_character":48},"updated":"2022-02-14 10:55:04.000000000","message":"Instead of looping the network list, could you prepare a dict of networks before calling the function?\n\nAdd the following after L.208\n\n  network_dict \u003d dict((n.id, n) for n in network_list)\n\nand change add_more_info_port_name to\n\n  add_more_info_port_name(port, network_dict[port.network_id])\n\nIf so, the code of add_more_info_port_name would be unchanged.","commit_id":"782ed9d52fd86dc771c972a0f8f9ffe7851195d8"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"f684a34075a55ab88f69bcc903292c736e1e16c8","unresolved":false,"context_lines":[{"line_number":198,"context_line":"                [ip[\u0027ip_address\u0027] for ip in port[\u0027fixed_ips\u0027]]))"},{"line_number":199,"context_line":"        if with_network and network_id:"},{"line_number":200,"context_line":"            port_name +\u003d \" - {}\".format("},{"line_number":201,"context_line":"                [network.name_or_id for network in networks"},{"line_number":202,"context_line":"                 if network.id \u003d\u003d network_id][0])"},{"line_number":203,"context_line":"        return port_name"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"    ports \u003d []"}],"source_content_type":"text/x-python","patch_set":4,"id":"642954ba_a5f4e1b5","line":202,"range":{"start_line":201,"start_character":16,"end_line":202,"end_character":48},"in_reply_to":"43be5aef_659b35f5","updated":"2022-02-24 06:47:14.000000000","message":"Done","commit_id":"782ed9d52fd86dc771c972a0f8f9ffe7851195d8"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"37daab68a19a81358332d4b36553ee8ae2daa227","unresolved":true,"context_lines":[{"line_number":206,"context_line":"    if api.base.is_service_enabled(request, \u0027network\u0027):"},{"line_number":207,"context_line":"        network_list \u003d api.neutron.network_list_for_tenant("},{"line_number":208,"context_line":"            request, request.user.tenant_id)"},{"line_number":209,"context_line":"        # return ports"},{"line_number":210,"context_line":"        ports \u003d [(port.id, add_more_info_port_name(port,"},{"line_number":211,"context_line":"                                                   network_list,"},{"line_number":212,"context_line":"                                                   port.network_id))"}],"source_content_type":"text/x-python","patch_set":4,"id":"60dcf01c_6a49cc15","line":209,"range":{"start_line":209,"start_character":8,"end_line":209,"end_character":22},"updated":"2022-02-14 10:55:04.000000000","message":"nit: this comment looks unnecesary","commit_id":"782ed9d52fd86dc771c972a0f8f9ffe7851195d8"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"f684a34075a55ab88f69bcc903292c736e1e16c8","unresolved":false,"context_lines":[{"line_number":206,"context_line":"    if api.base.is_service_enabled(request, \u0027network\u0027):"},{"line_number":207,"context_line":"        network_list \u003d api.neutron.network_list_for_tenant("},{"line_number":208,"context_line":"            request, request.user.tenant_id)"},{"line_number":209,"context_line":"        # return ports"},{"line_number":210,"context_line":"        ports \u003d [(port.id, add_more_info_port_name(port,"},{"line_number":211,"context_line":"                                                   network_list,"},{"line_number":212,"context_line":"                                                   port.network_id))"}],"source_content_type":"text/x-python","patch_set":4,"id":"797a4f62_819b1aa3","line":209,"range":{"start_line":209,"start_character":8,"end_line":209,"end_character":22},"in_reply_to":"60dcf01c_6a49cc15","updated":"2022-02-24 06:47:14.000000000","message":"Done","commit_id":"782ed9d52fd86dc771c972a0f8f9ffe7851195d8"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"37daab68a19a81358332d4b36553ee8ae2daa227","unresolved":true,"context_lines":[{"line_number":213,"context_line":"                 for port in api.neutron.port_list_with_trunk_types("},{"line_number":214,"context_line":"            request, tenant_id\u003drequest.user.tenant_id)"},{"line_number":215,"context_line":"            if (not port.device_owner and"},{"line_number":216,"context_line":"                not isinstance(port, api.neutron.PortTrunkSubport))]"},{"line_number":217,"context_line":"    ports.sort(key\u003dlambda obj: obj[1])"},{"line_number":218,"context_line":"    return ports"},{"line_number":219,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"67b54385_a6d5e2aa","line":216,"updated":"2022-02-14 10:55:04.000000000","message":"nit: The current indent is not easy to read. Could you consider:\n\n  ports \u003d [\n      (port.id, add_more_info_port_name(....))\n      for port\n      in api.neutron.port_list_with_trunk_types(\n          request, tenant_id\u003drequest.user.tenant_id)\n      if (not port.device_owner and\n          not isinstance(port, api.neutron.PortTrunkSubport))\n  ]","commit_id":"782ed9d52fd86dc771c972a0f8f9ffe7851195d8"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"f684a34075a55ab88f69bcc903292c736e1e16c8","unresolved":false,"context_lines":[{"line_number":213,"context_line":"                 for port in api.neutron.port_list_with_trunk_types("},{"line_number":214,"context_line":"            request, tenant_id\u003drequest.user.tenant_id)"},{"line_number":215,"context_line":"            if (not port.device_owner and"},{"line_number":216,"context_line":"                not isinstance(port, api.neutron.PortTrunkSubport))]"},{"line_number":217,"context_line":"    ports.sort(key\u003dlambda obj: obj[1])"},{"line_number":218,"context_line":"    return ports"},{"line_number":219,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"0edb84b7_07749931","line":216,"in_reply_to":"67b54385_a6d5e2aa","updated":"2022-02-24 06:47:14.000000000","message":"Done","commit_id":"782ed9d52fd86dc771c972a0f8f9ffe7851195d8"}]}
