)]}'
{"nova/tests/unit/virt/test_hardware.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e57c0e13374a4472d7dd82fa62469a443610bf39","unresolved":false,"context_lines":[{"line_number":1210,"context_line":"                \"image\": {"},{"line_number":1211,"context_line":"                },"},{"line_number":1212,"context_line":"                \"expect\": exception.ImageNUMATopologyIncomplete,"},{"line_number":1213,"context_line":"            },"},{"line_number":1214,"context_line":"            {"},{"line_number":1215,"context_line":"                # Image attempts to override flavor"},{"line_number":1216,"context_line":"                \"flavor\": objects.Flavor(vcpus\u003d8, memory_mb\u003d2048,"}],"source_content_type":"text/x-python","patch_set":11,"id":"bf51134e_a8fe3534","line":1213,"updated":"2020-06-19 16:50:28.000000000","message":"For anyone curious, the reason this is necessary in addition to the two test cases above is that the code used to extract this returns early if if finds a value to be missing. If e.g. \u0027hw:numa_mem.0\u0027 is missing, it\u0027ll return no memory allocations (i.e. what we\u0027re testing above), which is different to returning an incomplete set of memory allocations (what we\u0027re testing here)","commit_id":"26c1567a16d0bbf9ae19327aeafaa7ebc4394946"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"b62cf4f90833f5afae121b4b4d6bc4ee8ad9bb2f","unresolved":false,"context_lines":[{"line_number":1210,"context_line":"                \"image\": {"},{"line_number":1211,"context_line":"                },"},{"line_number":1212,"context_line":"                \"expect\": exception.ImageNUMATopologyIncomplete,"},{"line_number":1213,"context_line":"            },"},{"line_number":1214,"context_line":"            {"},{"line_number":1215,"context_line":"                # Image attempts to override flavor"},{"line_number":1216,"context_line":"                \"flavor\": objects.Flavor(vcpus\u003d8, memory_mb\u003d2048,"}],"source_content_type":"text/x-python","patch_set":11,"id":"bf51134e_e4014e08","line":1213,"in_reply_to":"bf51134e_a8fe3534","updated":"2020-06-23 10:28:01.000000000","message":"Thanks for the extra coverage!","commit_id":"26c1567a16d0bbf9ae19327aeafaa7ebc4394946"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"b62cf4f90833f5afae121b4b4d6bc4ee8ad9bb2f","unresolved":false,"context_lines":[{"line_number":2473,"context_line":"            exception.MemoryPageSizeInvalid,"},{"line_number":2474,"context_line":"            self._test_get_requested_mempages_pagesize,"},{"line_number":2475,"context_line":"            {\"hw:mem_page_size\": \"2M\"})"},{"line_number":2476,"context_line":"        self.assertIn(\"2M\", str(ex))"},{"line_number":2477,"context_line":""},{"line_number":2478,"context_line":"    def test_get_requested_mempages_pagesizes_from_flavor_suffix_sweep(self):"},{"line_number":2479,"context_line":"        self.assertEqual("}],"source_content_type":"text/x-python","patch_set":11,"id":"bf51134e_8706941b","line":2476,"updated":"2020-06-23 10:28:01.000000000","message":"I hit this (and its friend 1G) soo many times :)","commit_id":"26c1567a16d0bbf9ae19327aeafaa7ebc4394946"}],"nova/virt/hardware.py":[{"author":{"_account_id":30209,"name":"Huaqiang","email":"huaqiang.wang@intel.com","username":"Huaqiang.Wang"},"change_message_id":"be8db4cc4c71f2676f2c3bf473d7a654da925db4","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    :returns: a set of CPU indexes"},{"line_number":103,"context_line":"    \"\"\""},{"line_number":104,"context_line":"    cpuset_ids: ty.Set[int] \u003d set()"},{"line_number":105,"context_line":"    cpuset_reject_ids: ty.Set[int] \u003d set()"},{"line_number":106,"context_line":"    for rule in spec.split(\u0027,\u0027):"},{"line_number":107,"context_line":"        rule \u003d rule.strip()"},{"line_number":108,"context_line":"        # Handle multi \u0027,\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"df33271e_2187e5d9","line":105,"updated":"2020-03-27 09:48:44.000000000","message":"If the above two variables are checked too much? both of them are used locally, the coder should make sure it used as a \u0027set()\u0027. Just be curious about how you thinking.","commit_id":"d0fb2321ae8a4b5d35d9d894840bf893207a80aa"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"58eaa373be66f44a81cdbfe5354fc057386299b7","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    :returns: a set of CPU indexes"},{"line_number":103,"context_line":"    \"\"\""},{"line_number":104,"context_line":"    cpuset_ids: ty.Set[int] \u003d set()"},{"line_number":105,"context_line":"    cpuset_reject_ids: ty.Set[int] \u003d set()"},{"line_number":106,"context_line":"    for rule in spec.split(\u0027,\u0027):"},{"line_number":107,"context_line":"        rule \u003d rule.strip()"},{"line_number":108,"context_line":"        # Handle multi \u0027,\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"df33271e_7237fde4","line":105,"in_reply_to":"df33271e_2187e5d9","updated":"2020-03-27 12:12:43.000000000","message":"I\u0027m not sure what your question is? mypy warned that it couldn\u0027t figure out the type of this variable so I added the type manually. The type is correct, right?","commit_id":"d0fb2321ae8a4b5d35d9d894840bf893207a80aa"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"3a401d8d468a7f77bd41d46eadc0e8bbb004d1ce","unresolved":false,"context_lines":[{"line_number":17,"context_line":"import itertools"},{"line_number":18,"context_line":"import math"},{"line_number":19,"context_line":"import re"},{"line_number":20,"context_line":"import typing as ty"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"import os_resource_classes as orc"},{"line_number":23,"context_line":"import os_traits"}],"source_content_type":"text/x-python","patch_set":4,"id":"df33271e_f6412f0d","line":20,"range":{"start_line":20,"start_character":7,"end_line":20,"end_character":13},"updated":"2020-03-28 15:30:56.000000000","message":"Question/suggestion: visually, I\u0027d much prefer if we didn\u0027t have the \u0027ty.\u0027 prefix everywhere, so I\u0027d feel\n\n  from typing import List, Set, Dict\n\nwould be cleaner. And then we could just say, for example:\n\n  def parse_cpu_spec(spec: str) -\u003e Set[int]\n\nHowever, maybe that goes against convention/best practices?","commit_id":"186437acab6d68881e1b7bb545d8b373d201bb08"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e58144875e8c17fd36e898208c7b05e140b50e85","unresolved":false,"context_lines":[{"line_number":17,"context_line":"import itertools"},{"line_number":18,"context_line":"import math"},{"line_number":19,"context_line":"import re"},{"line_number":20,"context_line":"import typing as ty"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"import os_resource_classes as orc"},{"line_number":23,"context_line":"import os_traits"}],"source_content_type":"text/x-python","patch_set":4,"id":"df33271e_9ba09a92","line":20,"range":{"start_line":20,"start_character":7,"end_line":20,"end_character":13},"in_reply_to":"df33271e_45a92c8e","updated":"2020-03-31 14:55:11.000000000","message":"Yup, that\u0027s what we have in hardware.py [1] at the moment. It\u0027s certainly possible but I\u0027d still personally much rather keep this stuff namespaced. I\u0027ve written a good amount of this stuff [2][3] and doing it this way does tend to lead to clearer type signatures. It\u0027s also what we do for everything else that isn\u0027t translations.\n\n[1] https://github.com/openstack/nova/blob/5c119a21ea/nova/virt/hardware.py#L20\n[2] https://review.opendev.org/#/q/status:open+project:openstack/nova+branch:master+topic:mypy-integration\n[3] https://review.opendev.org/#/q/status:open+project:openstack/nova+branch:master+topic:pytype","commit_id":"186437acab6d68881e1b7bb545d8b373d201bb08"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"26f7717ad51fbddc897d212c1c13f3543f881a49","unresolved":false,"context_lines":[{"line_number":17,"context_line":"import itertools"},{"line_number":18,"context_line":"import math"},{"line_number":19,"context_line":"import re"},{"line_number":20,"context_line":"import typing as ty"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"import os_resource_classes as orc"},{"line_number":23,"context_line":"import os_traits"}],"source_content_type":"text/x-python","patch_set":4,"id":"df33271e_45a92c8e","line":20,"range":{"start_line":20,"start_character":7,"end_line":20,"end_character":13},"in_reply_to":"df33271e_c4d9c357","updated":"2020-03-30 14:01:36.000000000","message":"We wouldn\u0027t have to `from typing import *` - just the specific types we need. Doing a quick search, I can\u0027t find any examples of Dict, or List, or Set that\u0027s not in docstrings.","commit_id":"186437acab6d68881e1b7bb545d8b373d201bb08"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ff4e85aa7e9957e1250164f77c75f4731b7cad58","unresolved":false,"context_lines":[{"line_number":17,"context_line":"import itertools"},{"line_number":18,"context_line":"import math"},{"line_number":19,"context_line":"import re"},{"line_number":20,"context_line":"import typing as ty"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"import os_resource_classes as orc"},{"line_number":23,"context_line":"import os_traits"}],"source_content_type":"text/x-python","patch_set":4,"id":"df33271e_c4d9c357","line":20,"range":{"start_line":20,"start_character":7,"end_line":20,"end_character":13},"in_reply_to":"df33271e_f6412f0d","updated":"2020-03-30 11:28:42.000000000","message":"I initially went that way, but decided not to because you\u0027d be surprised how often the various types this expose conflict with existing classes and attributes we have here. \u0027ty.\u0027 seemed like the least intrusive approach to namespacing I could do","commit_id":"186437acab6d68881e1b7bb545d8b373d201bb08"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"3a401d8d468a7f77bd41d46eadc0e8bbb004d1ce","unresolved":false,"context_lines":[{"line_number":973,"context_line":"            # maximize resource usage for almost-full nodes at the expense of a"},{"line_number":974,"context_line":"            # possible performance impact to the guest."},{"line_number":975,"context_line":"            sibling_set \u003d ["},{"line_number":976,"context_line":"                set([x]) for x in itertools.chain(*sibling_sets[1])"},{"line_number":977,"context_line":"            ]"},{"line_number":978,"context_line":"            pinning \u003d _get_pinning("},{"line_number":979,"context_line":"                threads_no, sibling_set,"}],"source_content_type":"text/x-python","patch_set":4,"id":"df33271e_d644eb1d","line":976,"updated":"2020-03-28 15:30:56.000000000","message":"Seems like an unrelated change...","commit_id":"186437acab6d68881e1b7bb545d8b373d201bb08"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"3a401d8d468a7f77bd41d46eadc0e8bbb004d1ce","unresolved":false,"context_lines":[{"line_number":1189,"context_line":"    flavor: \u0027objects.Flavor\u0027,"},{"line_number":1190,"context_line":"    image_meta: \u0027objects.ImageMeta\u0027,"},{"line_number":1191,"context_line":"    default: ty.Any \u003d None,"},{"line_number":1192,"context_line":"):"},{"line_number":1193,"context_line":"    \"\"\"Extract both flavor- and image-based variants of metadata.\"\"\""},{"line_number":1194,"context_line":"    flavor_key \u003d \u0027:\u0027.join([\u0027hw\u0027, key])"},{"line_number":1195,"context_line":"    image_key \u003d \u0027_\u0027.join([\u0027hw\u0027, key])"}],"source_content_type":"text/x-python","patch_set":4,"id":"df33271e_16465322","line":1192,"updated":"2020-03-28 15:30:56.000000000","message":"Looks like you forgot the return type here?","commit_id":"186437acab6d68881e1b7bb545d8b373d201bb08"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ff4e85aa7e9957e1250164f77c75f4731b7cad58","unresolved":false,"context_lines":[{"line_number":1189,"context_line":"    flavor: \u0027objects.Flavor\u0027,"},{"line_number":1190,"context_line":"    image_meta: \u0027objects.ImageMeta\u0027,"},{"line_number":1191,"context_line":"    default: ty.Any \u003d None,"},{"line_number":1192,"context_line":"):"},{"line_number":1193,"context_line":"    \"\"\"Extract both flavor- and image-based variants of metadata.\"\"\""},{"line_number":1194,"context_line":"    flavor_key \u003d \u0027:\u0027.join([\u0027hw\u0027, key])"},{"line_number":1195,"context_line":"    image_key \u003d \u0027_\u0027.join([\u0027hw\u0027, key])"}],"source_content_type":"text/x-python","patch_set":4,"id":"df33271e_24db4f4f","line":1192,"in_reply_to":"df33271e_16465322","updated":"2020-03-30 11:28:42.000000000","message":"Whoops","commit_id":"186437acab6d68881e1b7bb545d8b373d201bb08"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"3a401d8d468a7f77bd41d46eadc0e8bbb004d1ce","unresolved":false,"context_lines":[{"line_number":1203,"context_line":"def get_mem_encryption_constraint("},{"line_number":1204,"context_line":"    flavor: \u0027objects.Flavor\u0027,"},{"line_number":1205,"context_line":"    image_meta: \u0027objects.ImageMeta\u0027,"},{"line_number":1206,"context_line":"    machine_type: ty.Optional[str] \u003d None,"},{"line_number":1207,"context_line":") -\u003e bool:"},{"line_number":1208,"context_line":"    \"\"\"Return a boolean indicating whether encryption of guest memory was"},{"line_number":1209,"context_line":"    requested, either via the hw:mem_encryption extra spec or the"}],"source_content_type":"text/x-python","patch_set":4,"id":"df33271e_b66047a7","line":1206,"range":{"start_line":1206,"start_character":21,"end_line":1206,"end_character":34},"updated":"2020-03-28 15:30:56.000000000","message":"Not to self: this means `str or None`","commit_id":"186437acab6d68881e1b7bb545d8b373d201bb08"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"3a401d8d468a7f77bd41d46eadc0e8bbb004d1ce","unresolved":false,"context_lines":[{"line_number":1344,"context_line":"def _get_numa_pagesize_constraint("},{"line_number":1345,"context_line":"    flavor: \u0027objects.Flavor\u0027,"},{"line_number":1346,"context_line":"    image_meta: \u0027objects.ImageMeta\u0027,"},{"line_number":1347,"context_line":") -\u003e ty.Optional[int]:"},{"line_number":1348,"context_line":"    \"\"\"Return the requested memory page size"},{"line_number":1349,"context_line":""},{"line_number":1350,"context_line":"    :param flavor: a Flavor object to read extra specs from"}],"source_content_type":"text/x-python","patch_set":4,"id":"df33271e_966383b1","line":1347,"range":{"start_line":1347,"start_character":8,"end_line":1347,"end_character":21},"updated":"2020-03-28 15:30:56.000000000","message":"Note to self: and I guess this means `int or None - aka raises`?","commit_id":"186437acab6d68881e1b7bb545d8b373d201bb08"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ff4e85aa7e9957e1250164f77c75f4731b7cad58","unresolved":false,"context_lines":[{"line_number":1344,"context_line":"def _get_numa_pagesize_constraint("},{"line_number":1345,"context_line":"    flavor: \u0027objects.Flavor\u0027,"},{"line_number":1346,"context_line":"    image_meta: \u0027objects.ImageMeta\u0027,"},{"line_number":1347,"context_line":") -\u003e ty.Optional[int]:"},{"line_number":1348,"context_line":"    \"\"\"Return the requested memory page size"},{"line_number":1349,"context_line":""},{"line_number":1350,"context_line":"    :param flavor: a Flavor object to read extra specs from"}],"source_content_type":"text/x-python","patch_set":4,"id":"df33271e_a4ee3fea","line":1347,"range":{"start_line":1347,"start_character":8,"end_line":1347,"end_character":21},"in_reply_to":"df33271e_966383b1","updated":"2020-03-30 11:28:42.000000000","message":"\u003e Note to self: and I guess this means `int or None - aka raises`?\n\nJust int or None. We can return the latter if no flavor was requested (lines 1390-1393)","commit_id":"186437acab6d68881e1b7bb545d8b373d201bb08"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"3a401d8d468a7f77bd41d46eadc0e8bbb004d1ce","unresolved":false,"context_lines":[{"line_number":1841,"context_line":"        cpu_list \u003d _get_numa_cpu_constraint(flavor, image_meta)"},{"line_number":1842,"context_line":"        mem_list \u003d _get_numa_mem_constraint(flavor, image_meta)"},{"line_number":1843,"context_line":""},{"line_number":1844,"context_line":"        if cpu_list is None and mem_list is None:"},{"line_number":1845,"context_line":"            numa_topology \u003d _get_numa_topology_auto("},{"line_number":1846,"context_line":"                nodes, flavor)"},{"line_number":1847,"context_line":"        elif cpu_list is not None and mem_list is not None:"},{"line_number":1848,"context_line":"            # If any node has data set, all nodes must have data set"},{"line_number":1849,"context_line":"            if len(cpu_list) !\u003d nodes or len(mem_list) !\u003d nodes:"},{"line_number":1850,"context_line":"                raise exception.ImageNUMATopologyIncomplete()"},{"line_number":1851,"context_line":""},{"line_number":1852,"context_line":"            numa_topology \u003d _get_numa_topology_manual("},{"line_number":1853,"context_line":"                nodes, flavor, cpu_list, mem_list"},{"line_number":1854,"context_line":"            )"},{"line_number":1855,"context_line":"        else:"},{"line_number":1856,"context_line":"            # If one property list is specified both must be"},{"line_number":1857,"context_line":"            raise exception.ImageNUMATopologyIncomplete()"},{"line_number":1858,"context_line":""},{"line_number":1859,"context_line":"        # We currently support same pagesize for all cells."},{"line_number":1860,"context_line":"        for c in numa_topology.cells:"}],"source_content_type":"text/x-python","patch_set":4,"id":"df33271e_f65acff0","line":1857,"range":{"start_line":1844,"start_character":8,"end_line":1857,"end_character":57},"updated":"2020-03-28 15:30:56.000000000","message":"unrelated?","commit_id":"186437acab6d68881e1b7bb545d8b373d201bb08"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"26f7717ad51fbddc897d212c1c13f3543f881a49","unresolved":false,"context_lines":[{"line_number":1841,"context_line":"        cpu_list \u003d _get_numa_cpu_constraint(flavor, image_meta)"},{"line_number":1842,"context_line":"        mem_list \u003d _get_numa_mem_constraint(flavor, image_meta)"},{"line_number":1843,"context_line":""},{"line_number":1844,"context_line":"        if cpu_list is None and mem_list is None:"},{"line_number":1845,"context_line":"            numa_topology \u003d _get_numa_topology_auto("},{"line_number":1846,"context_line":"                nodes, flavor)"},{"line_number":1847,"context_line":"        elif cpu_list is not None and mem_list is not None:"},{"line_number":1848,"context_line":"            # If any node has data set, all nodes must have data set"},{"line_number":1849,"context_line":"            if len(cpu_list) !\u003d nodes or len(mem_list) !\u003d nodes:"},{"line_number":1850,"context_line":"                raise exception.ImageNUMATopologyIncomplete()"},{"line_number":1851,"context_line":""},{"line_number":1852,"context_line":"            numa_topology \u003d _get_numa_topology_manual("},{"line_number":1853,"context_line":"                nodes, flavor, cpu_list, mem_list"},{"line_number":1854,"context_line":"            )"},{"line_number":1855,"context_line":"        else:"},{"line_number":1856,"context_line":"            # If one property list is specified both must be"},{"line_number":1857,"context_line":"            raise exception.ImageNUMATopologyIncomplete()"},{"line_number":1858,"context_line":""},{"line_number":1859,"context_line":"        # We currently support same pagesize for all cells."},{"line_number":1860,"context_line":"        for c in numa_topology.cells:"}],"source_content_type":"text/x-python","patch_set":4,"id":"df33271e_450c8c93","line":1857,"range":{"start_line":1844,"start_character":8,"end_line":1857,"end_character":57},"in_reply_to":"df33271e_64d1d723","updated":"2020-03-30 14:01:36.000000000","message":"Ah I see - and the new way is probably cleaner too,so :)","commit_id":"186437acab6d68881e1b7bb545d8b373d201bb08"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ff4e85aa7e9957e1250164f77c75f4731b7cad58","unresolved":false,"context_lines":[{"line_number":1841,"context_line":"        cpu_list \u003d _get_numa_cpu_constraint(flavor, image_meta)"},{"line_number":1842,"context_line":"        mem_list \u003d _get_numa_mem_constraint(flavor, image_meta)"},{"line_number":1843,"context_line":""},{"line_number":1844,"context_line":"        if cpu_list is None and mem_list is None:"},{"line_number":1845,"context_line":"            numa_topology \u003d _get_numa_topology_auto("},{"line_number":1846,"context_line":"                nodes, flavor)"},{"line_number":1847,"context_line":"        elif cpu_list is not None and mem_list is not None:"},{"line_number":1848,"context_line":"            # If any node has data set, all nodes must have data set"},{"line_number":1849,"context_line":"            if len(cpu_list) !\u003d nodes or len(mem_list) !\u003d nodes:"},{"line_number":1850,"context_line":"                raise exception.ImageNUMATopologyIncomplete()"},{"line_number":1851,"context_line":""},{"line_number":1852,"context_line":"            numa_topology \u003d _get_numa_topology_manual("},{"line_number":1853,"context_line":"                nodes, flavor, cpu_list, mem_list"},{"line_number":1854,"context_line":"            )"},{"line_number":1855,"context_line":"        else:"},{"line_number":1856,"context_line":"            # If one property list is specified both must be"},{"line_number":1857,"context_line":"            raise exception.ImageNUMATopologyIncomplete()"},{"line_number":1858,"context_line":""},{"line_number":1859,"context_line":"        # We currently support same pagesize for all cells."},{"line_number":1860,"context_line":"        for c in numa_topology.cells:"}],"source_content_type":"text/x-python","patch_set":4,"id":"df33271e_64d1d723","line":1857,"range":{"start_line":1844,"start_character":8,"end_line":1857,"end_character":57},"in_reply_to":"df33271e_f65acff0","updated":"2020-03-30 11:28:42.000000000","message":"Nope. mypy is a bit dumb and couldn\u0027t grok that there was no situation where only one of cpu_list or mem_list would be none. If you revert this, you\u0027ll see the failure","commit_id":"186437acab6d68881e1b7bb545d8b373d201bb08"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"3a401d8d468a7f77bd41d46eadc0e8bbb004d1ce","unresolved":false,"context_lines":[{"line_number":2093,"context_line":"        chosen_host_cells: ty.List[\u0027objects.NUMACell\u0027] \u003d []"},{"line_number":2094,"context_line":"        for host_cell, instance_cell in zip("},{"line_number":2095,"context_line":"            host_cell_perm, instance_topology.cells,"},{"line_number":2096,"context_line":"        ):"},{"line_number":2097,"context_line":"            try:"},{"line_number":2098,"context_line":"                cpuset_reserved \u003d 0"},{"line_number":2099,"context_line":"                if (instance_topology.emulator_threads_isolated and"}],"source_content_type":"text/x-python","patch_set":4,"id":"df33271e_766ebf95","line":2096,"updated":"2020-03-28 15:30:56.000000000","message":"unrelated","commit_id":"186437acab6d68881e1b7bb545d8b373d201bb08"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"7d925b522e22c91a2e8c5634b1ba2ac84f055293","unresolved":false,"context_lines":[{"line_number":973,"context_line":"            # maximize resource usage for almost-full nodes at the expense of a"},{"line_number":974,"context_line":"            # possible performance impact to the guest."},{"line_number":975,"context_line":"            sibling_set \u003d ["},{"line_number":976,"context_line":"                set([x]) for x in itertools.chain(*sibling_sets[1])"},{"line_number":977,"context_line":"            ]"},{"line_number":978,"context_line":"            pinning \u003d _get_pinning("},{"line_number":979,"context_line":"                threads_no, sibling_set,"}],"source_content_type":"text/x-python","patch_set":6,"id":"1f493fa4_2ed30e62","line":976,"updated":"2020-04-28 14:23:39.000000000","message":"From PS4: looks like an unrelated change.","commit_id":"369989542fb0a6ae07372043cb72f66e6a06a779"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"6de4d7cc23c9d8c9f27731c62206c3876f2bc01e","unresolved":false,"context_lines":[{"line_number":973,"context_line":"            # maximize resource usage for almost-full nodes at the expense of a"},{"line_number":974,"context_line":"            # possible performance impact to the guest."},{"line_number":975,"context_line":"            sibling_set \u003d ["},{"line_number":976,"context_line":"                set([x]) for x in itertools.chain(*sibling_sets[1])"},{"line_number":977,"context_line":"            ]"},{"line_number":978,"context_line":"            pinning \u003d _get_pinning("},{"line_number":979,"context_line":"                threads_no, sibling_set,"}],"source_content_type":"text/x-python","patch_set":6,"id":"1f493fa4_85551d53","line":976,"in_reply_to":"1f493fa4_2ed30e62","updated":"2020-05-08 09:58:44.000000000","message":"Done","commit_id":"369989542fb0a6ae07372043cb72f66e6a06a779"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"7d925b522e22c91a2e8c5634b1ba2ac84f055293","unresolved":false,"context_lines":[{"line_number":1189,"context_line":"    flavor: \u0027objects.Flavor\u0027,"},{"line_number":1190,"context_line":"    image_meta: \u0027objects.ImageMeta\u0027,"},{"line_number":1191,"context_line":"    default: ty.Any \u003d None,"},{"line_number":1192,"context_line":"):"},{"line_number":1193,"context_line":"    \"\"\"Extract both flavor- and image-based variants of metadata.\"\"\""},{"line_number":1194,"context_line":"    flavor_key \u003d \u0027:\u0027.join([\u0027hw\u0027, key])"},{"line_number":1195,"context_line":"    image_key \u003d \u0027_\u0027.join([\u0027hw\u0027, key])"}],"source_content_type":"text/x-python","patch_set":6,"id":"1f493fa4_4ece5ab4","line":1192,"updated":"2020-04-28 14:23:39.000000000","message":"From PS4: return type missing.","commit_id":"369989542fb0a6ae07372043cb72f66e6a06a779"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"6de4d7cc23c9d8c9f27731c62206c3876f2bc01e","unresolved":false,"context_lines":[{"line_number":1189,"context_line":"    flavor: \u0027objects.Flavor\u0027,"},{"line_number":1190,"context_line":"    image_meta: \u0027objects.ImageMeta\u0027,"},{"line_number":1191,"context_line":"    default: ty.Any \u003d None,"},{"line_number":1192,"context_line":"):"},{"line_number":1193,"context_line":"    \"\"\"Extract both flavor- and image-based variants of metadata.\"\"\""},{"line_number":1194,"context_line":"    flavor_key \u003d \u0027:\u0027.join([\u0027hw\u0027, key])"},{"line_number":1195,"context_line":"    image_key \u003d \u0027_\u0027.join([\u0027hw\u0027, key])"}],"source_content_type":"text/x-python","patch_set":6,"id":"1f493fa4_6550d15f","line":1192,"in_reply_to":"1f493fa4_4ece5ab4","updated":"2020-05-08 09:58:44.000000000","message":"Done","commit_id":"369989542fb0a6ae07372043cb72f66e6a06a779"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"7d925b522e22c91a2e8c5634b1ba2ac84f055293","unresolved":false,"context_lines":[{"line_number":2093,"context_line":"        chosen_host_cells: ty.List[\u0027objects.NUMACell\u0027] \u003d []"},{"line_number":2094,"context_line":"        for host_cell, instance_cell in zip("},{"line_number":2095,"context_line":"            host_cell_perm, instance_topology.cells,"},{"line_number":2096,"context_line":"        ):"},{"line_number":2097,"context_line":"            try:"},{"line_number":2098,"context_line":"                cpuset_reserved \u003d 0"},{"line_number":2099,"context_line":"                if (instance_topology.emulator_threads_isolated and"}],"source_content_type":"text/x-python","patch_set":6,"id":"1f493fa4_8ec34289","line":2096,"updated":"2020-04-28 14:23:39.000000000","message":"From PS4: doesn\u0027t seem related.","commit_id":"369989542fb0a6ae07372043cb72f66e6a06a779"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"6de4d7cc23c9d8c9f27731c62206c3876f2bc01e","unresolved":false,"context_lines":[{"line_number":2093,"context_line":"        chosen_host_cells: ty.List[\u0027objects.NUMACell\u0027] \u003d []"},{"line_number":2094,"context_line":"        for host_cell, instance_cell in zip("},{"line_number":2095,"context_line":"            host_cell_perm, instance_topology.cells,"},{"line_number":2096,"context_line":"        ):"},{"line_number":2097,"context_line":"            try:"},{"line_number":2098,"context_line":"                cpuset_reserved \u003d 0"},{"line_number":2099,"context_line":"                if (instance_topology.emulator_threads_isolated and"}],"source_content_type":"text/x-python","patch_set":6,"id":"1f493fa4_45eaf574","line":2096,"in_reply_to":"1f493fa4_8ec34289","updated":"2020-05-08 09:58:44.000000000","message":"Done","commit_id":"369989542fb0a6ae07372043cb72f66e6a06a779"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"d0e4be98d13e47d36f0197c2e94b6f17c0caa32d","unresolved":false,"context_lines":[{"line_number":154,"context_line":""},{"line_number":155,"context_line":"def format_cpu_spec("},{"line_number":156,"context_line":"    cpuset: ty.Set[int],"},{"line_number":157,"context_line":"    allow_ranges: bool \u003d True,"},{"line_number":158,"context_line":") -\u003e str:"},{"line_number":159,"context_line":"    \"\"\"Format a libvirt CPU range specification."},{"line_number":160,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"ff570b3c_5d8e32d0","line":157,"range":{"start_line":157,"start_character":4,"end_line":157,"end_character":16},"updated":"2020-05-15 11:05:32.000000000","message":"nit - docstring","commit_id":"49ba4a9308262aa658a87835716a4e7c78d6bced"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"d0e4be98d13e47d36f0197c2e94b6f17c0caa32d","unresolved":false,"context_lines":[{"line_number":1839,"context_line":"        cpu_list \u003d _get_numa_cpu_constraint(flavor, image_meta)"},{"line_number":1840,"context_line":"        mem_list \u003d _get_numa_mem_constraint(flavor, image_meta)"},{"line_number":1841,"context_line":""},{"line_number":1842,"context_line":"        if cpu_list is None and mem_list is None:"},{"line_number":1843,"context_line":"            numa_topology \u003d _get_numa_topology_auto("},{"line_number":1844,"context_line":"                nodes, flavor)"},{"line_number":1845,"context_line":"        elif cpu_list is not None and mem_list is not None:"},{"line_number":1846,"context_line":"            # If any node has data set, all nodes must have data set"},{"line_number":1847,"context_line":"            if len(cpu_list) !\u003d nodes or len(mem_list) !\u003d nodes:"},{"line_number":1848,"context_line":"                raise exception.ImageNUMATopologyIncomplete()"},{"line_number":1849,"context_line":""},{"line_number":1850,"context_line":"            numa_topology \u003d _get_numa_topology_manual("},{"line_number":1851,"context_line":"                nodes, flavor, cpu_list, mem_list"},{"line_number":1852,"context_line":"            )"},{"line_number":1853,"context_line":"        else:"},{"line_number":1854,"context_line":"            # If one property list is specified both must be"},{"line_number":1855,"context_line":"            raise exception.ImageNUMATopologyIncomplete()"},{"line_number":1856,"context_line":""},{"line_number":1857,"context_line":"        # We currently support same pagesize for all cells."},{"line_number":1858,"context_line":"        for c in numa_topology.cells:"}],"source_content_type":"text/x-python","patch_set":8,"id":"ff570b3c_9d660a29","line":1855,"range":{"start_line":1842,"start_character":0,"end_line":1855,"end_character":57},"updated":"2020-05-15 11:05:32.000000000","message":"How is this refactor related to adding the typing information?","commit_id":"49ba4a9308262aa658a87835716a4e7c78d6bced"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"f5f2a0ba7b26345bff37275938b28644b963a2f8","unresolved":false,"context_lines":[{"line_number":1839,"context_line":"        cpu_list \u003d _get_numa_cpu_constraint(flavor, image_meta)"},{"line_number":1840,"context_line":"        mem_list \u003d _get_numa_mem_constraint(flavor, image_meta)"},{"line_number":1841,"context_line":""},{"line_number":1842,"context_line":"        if cpu_list is None and mem_list is None:"},{"line_number":1843,"context_line":"            numa_topology \u003d _get_numa_topology_auto("},{"line_number":1844,"context_line":"                nodes, flavor)"},{"line_number":1845,"context_line":"        elif cpu_list is not None and mem_list is not None:"},{"line_number":1846,"context_line":"            # If any node has data set, all nodes must have data set"},{"line_number":1847,"context_line":"            if len(cpu_list) !\u003d nodes or len(mem_list) !\u003d nodes:"},{"line_number":1848,"context_line":"                raise exception.ImageNUMATopologyIncomplete()"},{"line_number":1849,"context_line":""},{"line_number":1850,"context_line":"            numa_topology \u003d _get_numa_topology_manual("},{"line_number":1851,"context_line":"                nodes, flavor, cpu_list, mem_list"},{"line_number":1852,"context_line":"            )"},{"line_number":1853,"context_line":"        else:"},{"line_number":1854,"context_line":"            # If one property list is specified both must be"},{"line_number":1855,"context_line":"            raise exception.ImageNUMATopologyIncomplete()"},{"line_number":1856,"context_line":""},{"line_number":1857,"context_line":"        # We currently support same pagesize for all cells."},{"line_number":1858,"context_line":"        for c in numa_topology.cells:"}],"source_content_type":"text/x-python","patch_set":8,"id":"ff570b3c_cdf56def","line":1855,"range":{"start_line":1842,"start_character":0,"end_line":1855,"end_character":57},"in_reply_to":"ff570b3c_9d660a29","updated":"2020-05-15 12:56:30.000000000","message":"Yup, I should add the same thing I have in the following commit:\n\n  This requires some minor tweaks of code that mypy found confusing.\n\nHeck, this is probably boilerplate for any of these changes","commit_id":"49ba4a9308262aa658a87835716a4e7c78d6bced"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1959aee9edf53b8729ab78699d7a5d7cd50b5689","unresolved":false,"context_lines":[{"line_number":1188,"context_line":"    key: str,"},{"line_number":1189,"context_line":"    flavor: \u0027objects.Flavor\u0027,"},{"line_number":1190,"context_line":"    image_meta: \u0027objects.ImageMeta\u0027,"},{"line_number":1191,"context_line":"    default: ty.Any \u003d None,"},{"line_number":1192,"context_line":") -\u003e ty.Any:"},{"line_number":1193,"context_line":"    \"\"\"Extract both flavor- and image-based variants of metadata.\"\"\""},{"line_number":1194,"context_line":"    flavor_key \u003d \u0027:\u0027.join([\u0027hw\u0027, key])"}],"source_content_type":"text/x-python","patch_set":10,"id":"bf51134e_7b671e27","line":1191,"range":{"start_line":1191,"start_character":13,"end_line":1191,"end_character":27},"updated":"2020-06-16 10:11:55.000000000","message":"Isn\u0027t it an Optional[str] ?\n\n// later\n\nNo it could be string or int. So it is ty.Union[int, str, None] if I understand mypy correctly.","commit_id":"918600e2dada9b2d3802f17ae3acc65b6faae472"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"d5bfebb318b5b4337855567e9cdbbd5e7ecd4f6f","unresolved":false,"context_lines":[{"line_number":1188,"context_line":"    key: str,"},{"line_number":1189,"context_line":"    flavor: \u0027objects.Flavor\u0027,"},{"line_number":1190,"context_line":"    image_meta: \u0027objects.ImageMeta\u0027,"},{"line_number":1191,"context_line":"    default: ty.Any \u003d None,"},{"line_number":1192,"context_line":") -\u003e ty.Any:"},{"line_number":1193,"context_line":"    \"\"\"Extract both flavor- and image-based variants of metadata.\"\"\""},{"line_number":1194,"context_line":"    flavor_key \u003d \u0027:\u0027.join([\u0027hw\u0027, key])"}],"source_content_type":"text/x-python","patch_set":10,"id":"bf51134e_bbbcfd05","line":1191,"range":{"start_line":1191,"start_character":13,"end_line":1191,"end_character":27},"in_reply_to":"bf51134e_7b671e27","updated":"2020-06-17 13:36:27.000000000","message":"It guess it could be any primitive type, so str, int, bool, or None. It\u0027s also conceivable that it could be list of something too though. Any seemed reasonable.","commit_id":"918600e2dada9b2d3802f17ae3acc65b6faae472"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1470b6844d3569a6284db5cacf6d5f30b86089eb","unresolved":false,"context_lines":[{"line_number":1188,"context_line":"    key: str,"},{"line_number":1189,"context_line":"    flavor: \u0027objects.Flavor\u0027,"},{"line_number":1190,"context_line":"    image_meta: \u0027objects.ImageMeta\u0027,"},{"line_number":1191,"context_line":"    default: ty.Any \u003d None,"},{"line_number":1192,"context_line":") -\u003e ty.Any:"},{"line_number":1193,"context_line":"    \"\"\"Extract both flavor- and image-based variants of metadata.\"\"\""},{"line_number":1194,"context_line":"    flavor_key \u003d \u0027:\u0027.join([\u0027hw\u0027, key])"}],"source_content_type":"text/x-python","patch_set":10,"id":"bf51134e_804d3e74","line":1191,"range":{"start_line":1191,"start_character":13,"end_line":1191,"end_character":27},"in_reply_to":"bf51134e_bbbcfd05","updated":"2020-06-17 15:48:58.000000000","message":"Ahh as it is used as a replacement for any image property value it can be any type an image property can have. Yeah it could even have ListOfSetOfIntegers :/ due to hw_numa_cpus\n\nThen I agree that it is ty.Any","commit_id":"918600e2dada9b2d3802f17ae3acc65b6faae472"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1959aee9edf53b8729ab78699d7a5d7cd50b5689","unresolved":false,"context_lines":[{"line_number":1189,"context_line":"    flavor: \u0027objects.Flavor\u0027,"},{"line_number":1190,"context_line":"    image_meta: \u0027objects.ImageMeta\u0027,"},{"line_number":1191,"context_line":"    default: ty.Any \u003d None,"},{"line_number":1192,"context_line":") -\u003e ty.Any:"},{"line_number":1193,"context_line":"    \"\"\"Extract both flavor- and image-based variants of metadata.\"\"\""},{"line_number":1194,"context_line":"    flavor_key \u003d \u0027:\u0027.join([\u0027hw\u0027, key])"},{"line_number":1195,"context_line":"    image_key \u003d \u0027_\u0027.join([\u0027hw\u0027, key])"}],"source_content_type":"text/x-python","patch_set":10,"id":"bf51134e_fbadee31","line":1192,"range":{"start_line":1192,"start_character":0,"end_line":1192,"end_character":12},"updated":"2020-06-16 10:11:55.000000000","message":"Isn\u0027t it a Tuple[Optional[str], Optional[str]] ?\n\n// later\n\nno it is ty.Tuple[ty.Union[int, str, None], ty.Union[int, str, None]]\n\nwhich immediately shows a bunch of problematic calls, like get_number_of_serial_ports() that only converts the returned flavor_policy to int but not the image_policy, but wants to compare them with \u0027\u003c\u0027. \n\nI suggest to add at least a TODO here to fix the type annotation and the fallout. Until that ty.Tuple[ty.Any, ty.Any] is still a bit better that a pure ty.Any here","commit_id":"918600e2dada9b2d3802f17ae3acc65b6faae472"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bd3242ee2f1b58eca68f37abbc2a4b7bbc91e4d0","unresolved":false,"context_lines":[{"line_number":1189,"context_line":"    flavor: \u0027objects.Flavor\u0027,"},{"line_number":1190,"context_line":"    image_meta: \u0027objects.ImageMeta\u0027,"},{"line_number":1191,"context_line":"    default: ty.Any \u003d None,"},{"line_number":1192,"context_line":") -\u003e ty.Any:"},{"line_number":1193,"context_line":"    \"\"\"Extract both flavor- and image-based variants of metadata.\"\"\""},{"line_number":1194,"context_line":"    flavor_key \u003d \u0027:\u0027.join([\u0027hw\u0027, key])"},{"line_number":1195,"context_line":"    image_key \u003d \u0027_\u0027.join([\u0027hw\u0027, key])"}],"source_content_type":"text/x-python","patch_set":10,"id":"bf51134e_120675cf","line":1192,"range":{"start_line":1192,"start_character":0,"end_line":1192,"end_character":12},"in_reply_to":"bf51134e_60790a92","updated":"2020-06-19 09:16:59.000000000","message":"Done","commit_id":"918600e2dada9b2d3802f17ae3acc65b6faae472"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1470b6844d3569a6284db5cacf6d5f30b86089eb","unresolved":false,"context_lines":[{"line_number":1189,"context_line":"    flavor: \u0027objects.Flavor\u0027,"},{"line_number":1190,"context_line":"    image_meta: \u0027objects.ImageMeta\u0027,"},{"line_number":1191,"context_line":"    default: ty.Any \u003d None,"},{"line_number":1192,"context_line":") -\u003e ty.Any:"},{"line_number":1193,"context_line":"    \"\"\"Extract both flavor- and image-based variants of metadata.\"\"\""},{"line_number":1194,"context_line":"    flavor_key \u003d \u0027:\u0027.join([\u0027hw\u0027, key])"},{"line_number":1195,"context_line":"    image_key \u003d \u0027_\u0027.join([\u0027hw\u0027, key])"}],"source_content_type":"text/x-python","patch_set":10,"id":"bf51134e_60790a92","line":1192,"range":{"start_line":1192,"start_character":0,"end_line":1192,"end_character":12},"in_reply_to":"bf51134e_7b47051f","updated":"2020-06-17 15:48:58.000000000","message":"As we cannot define the type of the default parameter other than ty.Any we cannot define the type of the return value either. So lets hav eit ty.Tuple[ty.Any, ty.Any]","commit_id":"918600e2dada9b2d3802f17ae3acc65b6faae472"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"d5bfebb318b5b4337855567e9cdbbd5e7ecd4f6f","unresolved":false,"context_lines":[{"line_number":1189,"context_line":"    flavor: \u0027objects.Flavor\u0027,"},{"line_number":1190,"context_line":"    image_meta: \u0027objects.ImageMeta\u0027,"},{"line_number":1191,"context_line":"    default: ty.Any \u003d None,"},{"line_number":1192,"context_line":") -\u003e ty.Any:"},{"line_number":1193,"context_line":"    \"\"\"Extract both flavor- and image-based variants of metadata.\"\"\""},{"line_number":1194,"context_line":"    flavor_key \u003d \u0027:\u0027.join([\u0027hw\u0027, key])"},{"line_number":1195,"context_line":"    image_key \u003d \u0027_\u0027.join([\u0027hw\u0027, key])"}],"source_content_type":"text/x-python","patch_set":10,"id":"bf51134e_7b47051f","line":1192,"range":{"start_line":1192,"start_character":0,"end_line":1192,"end_character":12},"in_reply_to":"bf51134e_fbadee31","updated":"2020-06-17 13:36:27.000000000","message":"\u003e Isn\u0027t it a Tuple[Optional[str], Optional[str]] ?\n \u003e \n \u003e // later\n \u003e \n \u003e no it is ty.Tuple[ty.Union[int, str, None], ty.Union[int, str,\n \u003e None]]\n \u003e \n \u003e which immediately shows a bunch of problematic calls, like\n \u003e get_number_of_serial_ports() that only converts the returned\n \u003e flavor_policy to int but not the image_policy, but wants to compare\n \u003e them with \u0027\u003c\u0027.\n\nWe don\u0027t need to convert the image_policy since \u0027ImageMetaProps.hw_serial_port_count\u0027 in an \u0027IntegerField\u0027\n\n \u003e I suggest to add at least a TODO here to fix the type annotation\n \u003e and the fallout. Until that ty.Tuple[ty.Any, ty.Any] is still a bit\n \u003e better that a pure ty.Any here\n\nYup, good call.","commit_id":"918600e2dada9b2d3802f17ae3acc65b6faae472"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1959aee9edf53b8729ab78699d7a5d7cd50b5689","unresolved":false,"context_lines":[{"line_number":1681,"context_line":"    image_meta: \u0027objects.ImageMeta\u0027,"},{"line_number":1682,"context_line":") -\u003e ty.Optional[str]:"},{"line_number":1683,"context_line":"    for key, val in flavor.get(\u0027extra_specs\u0027, {}).items():"},{"line_number":1684,"context_line":"        if re.match(\u0027trait([1-9][0-9]*)?:%s\u0027 % os_traits.HW_CPU_HYPERTHREADING,"},{"line_number":1685,"context_line":"                    key):"},{"line_number":1686,"context_line":"            return val"},{"line_number":1687,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"bf51134e_d640bf0a","line":1684,"range":{"start_line":1684,"start_character":20,"end_line":1684,"end_character":44},"updated":"2020-06-16 10:11:55.000000000","message":"unrelated but this is incomplete (broken) based on the extra_spec validation rule https://github.com/openstack/nova/blob/1490a54fa92ece6d9fd676d8e4a7498460714f92/nova/api/validation/extra_specs/traits.py#L39\n\nReported bug https://bugs.launchpad.net/nova/+bug/1883682","commit_id":"918600e2dada9b2d3802f17ae3acc65b6faae472"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1959aee9edf53b8729ab78699d7a5d7cd50b5689","unresolved":false,"context_lines":[{"line_number":1689,"context_line":"            \u0027traits_required\u0027, []):"},{"line_number":1690,"context_line":"        return \u0027required\u0027"},{"line_number":1691,"context_line":""},{"line_number":1692,"context_line":"    return None"},{"line_number":1693,"context_line":""},{"line_number":1694,"context_line":""},{"line_number":1695,"context_line":"def _get_realtime_constraint("}],"source_content_type":"text/x-python","patch_set":10,"id":"bf51134e_f6aa23d0","line":1692,"updated":"2020-06-16 10:11:55.000000000","message":"Is it mypy that requires an explicit return None?","commit_id":"918600e2dada9b2d3802f17ae3acc65b6faae472"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"d5bfebb318b5b4337855567e9cdbbd5e7ecd4f6f","unresolved":false,"context_lines":[{"line_number":1689,"context_line":"            \u0027traits_required\u0027, []):"},{"line_number":1690,"context_line":"        return \u0027required\u0027"},{"line_number":1691,"context_line":""},{"line_number":1692,"context_line":"    return None"},{"line_number":1693,"context_line":""},{"line_number":1694,"context_line":""},{"line_number":1695,"context_line":"def _get_realtime_constraint("}],"source_content_type":"text/x-python","patch_set":10,"id":"bf51134e_5b0fa1e0","line":1692,"in_reply_to":"bf51134e_f6aa23d0","updated":"2020-06-17 13:36:27.000000000","message":"Yes. I don\u0027t know why they deem it necessary but they do :(","commit_id":"918600e2dada9b2d3802f17ae3acc65b6faae472"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1959aee9edf53b8729ab78699d7a5d7cd50b5689","unresolved":false,"context_lines":[{"line_number":1720,"context_line":"    :param image_meta: ``nova.objects.ImageMeta`` instance"},{"line_number":1721,"context_line":"    :raises: exception.RealtimeMaskNotFoundOrInvalid if mask was not found or"},{"line_number":1722,"context_line":"        is invalid."},{"line_number":1723,"context_line":"    :returns: The realtime CPU mask requested, else None."},{"line_number":1724,"context_line":"    \"\"\""},{"line_number":1725,"context_line":"    mask \u003d _get_realtime_constraint(flavor, image_meta)"},{"line_number":1726,"context_line":"    if not mask:"}],"source_content_type":"text/x-python","patch_set":10,"id":"bf51134e_96a007a8","line":1723,"range":{"start_line":1723,"start_character":46,"end_line":1723,"end_character":57},"updated":"2020-06-16 10:11:55.000000000","message":"This is now not in sync with the type def of the return value above. Looking at the code (I still does not trust mypy blindly) it seems to me that this function cannot return None.","commit_id":"918600e2dada9b2d3802f17ae3acc65b6faae472"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bd3242ee2f1b58eca68f37abbc2a4b7bbc91e4d0","unresolved":false,"context_lines":[{"line_number":1720,"context_line":"    :param image_meta: ``nova.objects.ImageMeta`` instance"},{"line_number":1721,"context_line":"    :raises: exception.RealtimeMaskNotFoundOrInvalid if mask was not found or"},{"line_number":1722,"context_line":"        is invalid."},{"line_number":1723,"context_line":"    :returns: The realtime CPU mask requested, else None."},{"line_number":1724,"context_line":"    \"\"\""},{"line_number":1725,"context_line":"    mask \u003d _get_realtime_constraint(flavor, image_meta)"},{"line_number":1726,"context_line":"    if not mask:"}],"source_content_type":"text/x-python","patch_set":10,"id":"bf51134e_f20821da","line":1723,"range":{"start_line":1723,"start_character":46,"end_line":1723,"end_character":57},"in_reply_to":"bf51134e_4d0fe8e0","updated":"2020-06-19 09:16:59.000000000","message":"Done","commit_id":"918600e2dada9b2d3802f17ae3acc65b6faae472"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"d5bfebb318b5b4337855567e9cdbbd5e7ecd4f6f","unresolved":false,"context_lines":[{"line_number":1720,"context_line":"    :param image_meta: ``nova.objects.ImageMeta`` instance"},{"line_number":1721,"context_line":"    :raises: exception.RealtimeMaskNotFoundOrInvalid if mask was not found or"},{"line_number":1722,"context_line":"        is invalid."},{"line_number":1723,"context_line":"    :returns: The realtime CPU mask requested, else None."},{"line_number":1724,"context_line":"    \"\"\""},{"line_number":1725,"context_line":"    mask \u003d _get_realtime_constraint(flavor, image_meta)"},{"line_number":1726,"context_line":"    if not mask:"}],"source_content_type":"text/x-python","patch_set":10,"id":"bf51134e_4d0fe8e0","line":1723,"range":{"start_line":1723,"start_character":46,"end_line":1723,"end_character":57},"in_reply_to":"bf51134e_96a007a8","updated":"2020-06-17 13:36:27.000000000","message":"Good spot. Will update.\n\n(It can\u0027t return None because we explicitly check for false\u0027y values from \u0027_get_realtime_constraint\u0027 and raise an exception if we hit them).","commit_id":"918600e2dada9b2d3802f17ae3acc65b6faae472"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1959aee9edf53b8729ab78699d7a5d7cd50b5689","unresolved":false,"context_lines":[{"line_number":1748,"context_line":"        \u0027hw:emulator_threads_policy\u0027)"},{"line_number":1749,"context_line":""},{"line_number":1750,"context_line":"    if not emu_threads_policy:"},{"line_number":1751,"context_line":"        return None"},{"line_number":1752,"context_line":""},{"line_number":1753,"context_line":"    if emu_threads_policy not in fields.CPUEmulatorThreadsPolicy.ALL:"},{"line_number":1754,"context_line":"        raise exception.InvalidEmulatorThreadsPolicy("}],"source_content_type":"text/x-python","patch_set":10,"id":"bf51134e_76bc53bb","line":1751,"updated":"2020-06-16 10:11:55.000000000","message":"Does mypy requires the explicity None here?","commit_id":"918600e2dada9b2d3802f17ae3acc65b6faae472"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"d5bfebb318b5b4337855567e9cdbbd5e7ecd4f6f","unresolved":false,"context_lines":[{"line_number":1748,"context_line":"        \u0027hw:emulator_threads_policy\u0027)"},{"line_number":1749,"context_line":""},{"line_number":1750,"context_line":"    if not emu_threads_policy:"},{"line_number":1751,"context_line":"        return None"},{"line_number":1752,"context_line":""},{"line_number":1753,"context_line":"    if emu_threads_policy not in fields.CPUEmulatorThreadsPolicy.ALL:"},{"line_number":1754,"context_line":"        raise exception.InvalidEmulatorThreadsPolicy("}],"source_content_type":"text/x-python","patch_set":10,"id":"bf51134e_3b146df5","line":1751,"in_reply_to":"bf51134e_76bc53bb","updated":"2020-06-17 13:36:27.000000000","message":"Yup","commit_id":"918600e2dada9b2d3802f17ae3acc65b6faae472"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1959aee9edf53b8729ab78699d7a5d7cd50b5689","unresolved":false,"context_lines":[{"line_number":1855,"context_line":"        else:"},{"line_number":1856,"context_line":"            # If one property list is specified both must be"},{"line_number":1857,"context_line":"            raise exception.ImageNUMATopologyIncomplete()"},{"line_number":1858,"context_line":""},{"line_number":1859,"context_line":"        # We currently support same pagesize for all cells."},{"line_number":1860,"context_line":"        for c in numa_topology.cells:"},{"line_number":1861,"context_line":"            setattr(c, \u0027pagesize\u0027, pagesize)"}],"source_content_type":"text/x-python","patch_set":10,"id":"bf51134e_1627d714","line":1858,"updated":"2020-06-16 10:11:55.000000000","message":"Seems like a clean refactor. But looking at the test coverage I think we have some gaps. If I comment out L1849-1850 nothing fails. This might seems like an unusual request, but could you add the missing test coverage before you refactor this logic?","commit_id":"918600e2dada9b2d3802f17ae3acc65b6faae472"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bd3242ee2f1b58eca68f37abbc2a4b7bbc91e4d0","unresolved":false,"context_lines":[{"line_number":1855,"context_line":"        else:"},{"line_number":1856,"context_line":"            # If one property list is specified both must be"},{"line_number":1857,"context_line":"            raise exception.ImageNUMATopologyIncomplete()"},{"line_number":1858,"context_line":""},{"line_number":1859,"context_line":"        # We currently support same pagesize for all cells."},{"line_number":1860,"context_line":"        for c in numa_topology.cells:"},{"line_number":1861,"context_line":"            setattr(c, \u0027pagesize\u0027, pagesize)"}],"source_content_type":"text/x-python","patch_set":10,"id":"bf51134e_3213b90f","line":1858,"in_reply_to":"bf51134e_1627d714","updated":"2020-06-19 09:16:59.000000000","message":"Done","commit_id":"918600e2dada9b2d3802f17ae3acc65b6faae472"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1959aee9edf53b8729ab78699d7a5d7cd50b5689","unresolved":false,"context_lines":[{"line_number":1976,"context_line":"    if not network_metadata:"},{"line_number":1977,"context_line":"        return True"},{"line_number":1978,"context_line":""},{"line_number":1979,"context_line":"    required_physnets: ty.Set[str] \u003d set()"},{"line_number":1980,"context_line":"    if \u0027physnets\u0027 in network_metadata:"},{"line_number":1981,"context_line":"        # use set() to avoid modifying the original data structure"},{"line_number":1982,"context_line":"        required_physnets \u003d set(network_metadata.physnets)"}],"source_content_type":"text/x-python","patch_set":10,"id":"bf51134e_f40dfc37","line":1979,"updated":"2020-06-16 10:11:55.000000000","message":"while this is a logic change the we did not assert None in required_physnets below so it is OK.","commit_id":"918600e2dada9b2d3802f17ae3acc65b6faae472"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1959aee9edf53b8729ab78699d7a5d7cd50b5689","unresolved":false,"context_lines":[{"line_number":2140,"context_line":""},{"line_number":2141,"context_line":"    :raises: exception.InvalidReservedMemoryPagesOption when"},{"line_number":2142,"context_line":"             reserved_huge_pages option is not correctly set."},{"line_number":2143,"context_line":"    :returns: a list of dict ordered by NUMA node ids; keys of dict"},{"line_number":2144,"context_line":"              are pages size and values of the number reserved."},{"line_number":2145,"context_line":"    \"\"\""},{"line_number":2146,"context_line":"    if not CONF.reserved_huge_pages:"},{"line_number":2147,"context_line":"        return {}"}],"source_content_type":"text/x-python","patch_set":10,"id":"bf51134e_f45b3c2b","line":2144,"range":{"start_line":2143,"start_character":0,"end_line":2144,"end_character":63},"updated":"2020-06-16 10:11:55.000000000","message":"This is not in line with the actual return type which is a Dict[int, Dict[int, int]]. And it is a scary difference as the text states that the order also matters.","commit_id":"918600e2dada9b2d3802f17ae3acc65b6faae472"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bd3242ee2f1b58eca68f37abbc2a4b7bbc91e4d0","unresolved":false,"context_lines":[{"line_number":2140,"context_line":""},{"line_number":2141,"context_line":"    :raises: exception.InvalidReservedMemoryPagesOption when"},{"line_number":2142,"context_line":"             reserved_huge_pages option is not correctly set."},{"line_number":2143,"context_line":"    :returns: a list of dict ordered by NUMA node ids; keys of dict"},{"line_number":2144,"context_line":"              are pages size and values of the number reserved."},{"line_number":2145,"context_line":"    \"\"\""},{"line_number":2146,"context_line":"    if not CONF.reserved_huge_pages:"},{"line_number":2147,"context_line":"        return {}"}],"source_content_type":"text/x-python","patch_set":10,"id":"bf51134e_122f953f","line":2144,"range":{"start_line":2143,"start_character":0,"end_line":2144,"end_character":63},"in_reply_to":"bf51134e_f45b3c2b","updated":"2020-06-19 09:16:59.000000000","message":"Done","commit_id":"918600e2dada9b2d3802f17ae3acc65b6faae472"}],"tox.ini":[{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"d0e4be98d13e47d36f0197c2e94b6f17c0caa32d","unresolved":false,"context_lines":[{"line_number":52,"context_line":"commands \u003d"},{"line_number":53,"context_line":"  {[testenv:mypy]commands}"},{"line_number":54,"context_line":"  bash tools/flake8wrap.sh {posargs}"},{"line_number":55,"context_line":"  {[testenv:mypy]commands}"},{"line_number":56,"context_line":"  # Check that all JSON files don\u0027t have \\r\\n in line."},{"line_number":57,"context_line":"  bash -c \"! find doc/ -type f -name *.json | xargs grep -U -n $\u0027\\r\u0027\""},{"line_number":58,"context_line":"  # Check that all included JSON files are valid JSON"}],"source_content_type":"text/x-properties","patch_set":8,"id":"ff570b3c_1d72fae3","line":55,"range":{"start_line":55,"start_character":0,"end_line":55,"end_character":26},"updated":"2020-05-15 11:05:32.000000000","message":"Was this just leftover after a rebase?","commit_id":"49ba4a9308262aa658a87835716a4e7c78d6bced"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"f5f2a0ba7b26345bff37275938b28644b963a2f8","unresolved":false,"context_lines":[{"line_number":52,"context_line":"commands \u003d"},{"line_number":53,"context_line":"  {[testenv:mypy]commands}"},{"line_number":54,"context_line":"  bash tools/flake8wrap.sh {posargs}"},{"line_number":55,"context_line":"  {[testenv:mypy]commands}"},{"line_number":56,"context_line":"  # Check that all JSON files don\u0027t have \\r\\n in line."},{"line_number":57,"context_line":"  bash -c \"! find doc/ -type f -name *.json | xargs grep -U -n $\u0027\\r\u0027\""},{"line_number":58,"context_line":"  # Check that all included JSON files are valid JSON"}],"source_content_type":"text/x-properties","patch_set":8,"id":"ff570b3c_0ddbe57b","line":55,"range":{"start_line":55,"start_character":0,"end_line":55,"end_character":26},"in_reply_to":"ff570b3c_1d72fae3","updated":"2020-05-15 12:56:30.000000000","message":"Oops, yeah","commit_id":"49ba4a9308262aa658a87835716a4e7c78d6bced"}]}
