)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"90fa65fe74d9340e41909bbd40d07f16ba982dac","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"a56f11ea_2f6df3a0","updated":"2026-01-23 19:19:24.000000000","message":"first succsefull boot with pci groups\n\nhttps://termbin.com/w6zr\nhttps://termbin.com/l244\n\ni need to do a little more work on this and resubmit the spec for 2026.2 but this is a funcitonal poc at this point","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"74903caee62ab4bcb1868d50361d7827fcd2fd9b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"29a7a51b_9e9fcb3a","updated":"2026-01-23 20:13:44.000000000","message":"teim-ci: manual","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"}],"nova/compute/pci_placement_translator.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":137,"context_line":"    :param custom_rc: Optional custom resource class from device spec"},{"line_number":138,"context_line":"    :returns: The normalized resource class for the group"},{"line_number":139,"context_line":"    \"\"\""},{"line_number":140,"context_line":"    if custom_rc:"},{"line_number":141,"context_line":"        return _normalize_resource_class(custom_rc)"},{"line_number":142,"context_line":"    # Default resource class format for groups"},{"line_number":143,"context_line":"    return _normalize_resource_class(f\"CUSTOM_PCI_GROUP_{group_type}\")"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"class PciResourceProvider:"}],"source_content_type":"text/x-python","patch_set":3,"id":"a672036c_3403dbf7","line":143,"range":{"start_line":140,"start_character":0,"end_line":143,"end_character":70},"updated":"2026-04-17 13:29:51.000000000","message":"We at least need to document this precedence order.","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":488,"context_line":""},{"line_number":489,"context_line":"    @property"},{"line_number":490,"context_line":"    def total(self) -\u003e int:"},{"line_number":491,"context_line":"        \"\"\"Return 1 if all devices in group are available, 0 otherwise.\"\"\""},{"line_number":492,"context_line":"        if not self.devices:"},{"line_number":493,"context_line":"            return 0 + self.adjustment"},{"line_number":494,"context_line":"        # A group is available only if all its devices are available"}],"source_content_type":"text/x-python","patch_set":3,"id":"90b9b834_2bcc4a11","line":491,"updated":"2026-04-17 13:29:51.000000000","message":"on the surface it make sense as a generalization. But I\u0027m getting stange feelings about how such situation happens when one dev is available but the other does not within the group. That is violating the invariant of the group that they are allocated together.","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":498,"context_line":""},{"line_number":499,"context_line":"    @property"},{"line_number":500,"context_line":"    def to_be_deleted(self) -\u003e bool:"},{"line_number":501,"context_line":"        return len(self.devices) \u003d\u003d 0 and self.adjustment \u003d\u003d 0"},{"line_number":502,"context_line":""},{"line_number":503,"context_line":"    def _all_devices_available(self) -\u003e bool:"},{"line_number":504,"context_line":"        \"\"\"Check if all devices in the group are available.\"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"3bd4d200_b8483433","line":501,"updated":"2026-04-17 13:29:51.000000000","message":"OK that supposed to handle when the RP is deleted when the last device is removed from the group. As a group cannot have less than two device by the spec definition (probably not enforced by the code) this will happen by not having the group defined at all.","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":515,"context_line":"        \"\"\"Add a device to this group.\"\"\""},{"line_number":516,"context_line":"        self.devices.append(dev)"},{"line_number":517,"context_line":""},{"line_number":518,"context_line":"        # Set resource class from group_type or custom resource_class"},{"line_number":519,"context_line":"        if not self.resource_class:"},{"line_number":520,"context_line":"            custom_rc \u003d dev_spec_tags.get(\"resource_class\")"},{"line_number":521,"context_line":"            self.resource_class \u003d get_resource_class_for_group("},{"line_number":522,"context_line":"                self.group_type, custom_rc"},{"line_number":523,"context_line":"            )"},{"line_number":524,"context_line":""},{"line_number":525,"context_line":"        # Merge traits from all devices"},{"line_number":526,"context_line":"        traits \u003d _get_traits_for_dev(dev_spec_tags)"}],"source_content_type":"text/x-python","patch_set":3,"id":"d0ce96ae_013430e4","line":523,"range":{"start_line":518,"start_character":0,"end_line":523,"end_character":13},"updated":"2026-04-17 13:29:51.000000000","message":"missing validation that two device in the same group does not propose conflicting RCs or group_type and RCs.","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":522,"context_line":"                self.group_type, custom_rc"},{"line_number":523,"context_line":"            )"},{"line_number":524,"context_line":""},{"line_number":525,"context_line":"        # Merge traits from all devices"},{"line_number":526,"context_line":"        traits \u003d _get_traits_for_dev(dev_spec_tags)"},{"line_number":527,"context_line":"        if self.traits is None:"},{"line_number":528,"context_line":"            self.traits \u003d traits"}],"source_content_type":"text/x-python","patch_set":3,"id":"38cc6eb7_7c5047ec","line":525,"updated":"2026-04-17 13:29:51.000000000","message":"Does it make sense to merge traits? This is design question. If I have two devices in a group one has trait CUSTOM_BLUE and the other has trait CUSTOM_RED. Does the group has both colors, a mix of colors ie CUSTOM_PURPLE, or non-of the colors? \n\nLike in case of live-migratable type of information the if one device has such a tag but the other does not the resulting group does not have the logical capability. So merging traits is a naive implementation as best.","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":532,"context_line":"    def _get_allocations(self) -\u003e ty.Mapping[str, int]:"},{"line_number":533,"context_line":"        \"\"\"Return a dict of used resources keyed by consumer UUID."},{"line_number":534,"context_line":""},{"line_number":535,"context_line":"        A group is allocated if ANY device in the group is allocated."},{"line_number":536,"context_line":"        All devices should have the same instance_uuid if allocated together."},{"line_number":537,"context_line":"        \"\"\""},{"line_number":538,"context_line":"        for dev in self.devices:"}],"source_content_type":"text/x-python","patch_set":3,"id":"28c1b6aa_064d7c1a","line":535,"updated":"2026-04-17 13:29:51.000000000","message":"whoa. that is dangerous. If there is a group half allocated that is an error of the invariant of the group. So we should thread carefully here.","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":575,"context_line":"        rp_uuid \u003d provider_tree.data(self.name).uuid"},{"line_number":576,"context_line":"        for dev in self.devices:"},{"line_number":577,"context_line":"            dev.extra_info[\u0027rp_uuid\u0027] \u003d rp_uuid"},{"line_number":578,"context_line":"            dev.extra_info[\u0027group_name\u0027] \u003d self.group_name"},{"line_number":579,"context_line":""},{"line_number":580,"context_line":"    def update_allocations("},{"line_number":581,"context_line":"        self,"}],"source_content_type":"text/x-python","patch_set":3,"id":"c2f2b2df_27c60b58","line":578,"updated":"2026-04-17 13:29:51.000000000","message":"wondering if this is already there when we matched the dev to the spec. I think so along with the group_type.","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":577,"context_line":"            dev.extra_info[\u0027rp_uuid\u0027] \u003d rp_uuid"},{"line_number":578,"context_line":"            dev.extra_info[\u0027group_name\u0027] \u003d self.group_name"},{"line_number":579,"context_line":""},{"line_number":580,"context_line":"    def update_allocations("},{"line_number":581,"context_line":"        self,"},{"line_number":582,"context_line":"        allocations: dict,"},{"line_number":583,"context_line":"        provider_tree: provider_tree.ProviderTree,"}],"source_content_type":"text/x-python","patch_set":3,"id":"06c08a1f_7a262109","line":580,"updated":"2026-04-17 13:29:51.000000000","message":"this is where I lost track of the code. Need to continue from here at some point.","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":703,"context_line":"        :param dev: The PCI device to add"},{"line_number":704,"context_line":"        :param dev_spec: The device spec that matched this device"},{"line_number":705,"context_line":"        :param group_info: A tuple of (group_name, group_type)"},{"line_number":706,"context_line":"        \"\"\""},{"line_number":707,"context_line":"        group_name, group_type \u003d group_info"},{"line_number":708,"context_line":"        rp_name \u003d self._get_rp_name_for_group(group_name)"},{"line_number":709,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"19f3f65f_c5c52067","line":706,"updated":"2026-04-17 13:29:51.000000000","message":"I think we should filter on physical_network tag too here like in _add_dev","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":777,"context_line":"            # step later in update_provider_tree to reconcile Placement"},{"line_number":778,"context_line":"            # allocations with our view and add back some inventories to handle"},{"line_number":779,"context_line":"            # removed but allocated devs."},{"line_number":780,"context_line":"            self._remove_dev(dev)"},{"line_number":781,"context_line":"        else:"},{"line_number":782,"context_line":"            if not dev_spec:"},{"line_number":783,"context_line":"                if dev.instance_uuid:"}],"source_content_type":"text/x-python","patch_set":3,"id":"d7a0fea9_b4ff3fd1","line":780,"updated":"2026-04-17 13:29:51.000000000","message":"Do we need to handle \n* a dev being removed from a group? \n* the last dev being removed from a group?","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"}],"nova/conf/pci.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":84,"context_line":"      \"device_type\": \"type-PCI\","},{"line_number":85,"context_line":"      \"resource_class\": \"CUSTOM_NVME256G\","},{"line_number":86,"context_line":"      \"traits\": \"nvme-with-crypto-erase\","},{"line_number":87,"context_line":"    }"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"  Valid key values are :"},{"line_number":90,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"94571963_ad9db96a","line":87,"updated":"2026-04-17 13:29:51.000000000","message":"We probably want to add an example here requesting a group via the resource_class","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":100,"context_line":"  ``device_type``"},{"line_number":101,"context_line":"    Type of PCI device. Valid values are: ``type-PCI``, ``type-PF`` and"},{"line_number":102,"context_line":"    ``type-VF``. Note that ``\"device_type\": \"type-PF\"`` **must** be specified"},{"line_number":103,"context_line":"    if you wish to passthrough a device that supports SR-IOV in its entirety."},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"  ``numa_policy``"},{"line_number":106,"context_line":"    Required NUMA affinity of device. Valid values are: ``legacy``,"}],"source_content_type":"text/x-python","patch_set":3,"id":"72b95abe_ce6f685d","line":103,"updated":"2026-04-17 13:29:51.000000000","message":"We need to say something about groups with mixed device types.","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":104,"context_line":""},{"line_number":105,"context_line":"  ``numa_policy``"},{"line_number":106,"context_line":"    Required NUMA affinity of device. Valid values are: ``legacy``,"},{"line_number":107,"context_line":"    ``preferred``, ``required``, and ``socket``."},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"  ``resource_class``"},{"line_number":110,"context_line":"    The optional Placement resource class name that is used"}],"source_content_type":"text/x-python","patch_set":3,"id":"451d029c_f1a6c57c","line":107,"updated":"2026-04-17 13:29:51.000000000","message":"We need to say something about what this will mean if the target of the alias is not a single device but a group of devices with potentially different NUMA locality.","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":106,"context_line":"    Required NUMA affinity of device. Valid values are: ``legacy``,"},{"line_number":107,"context_line":"    ``preferred``, ``required``, and ``socket``."},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"  ``resource_class``"},{"line_number":110,"context_line":"    The optional Placement resource class name that is used"},{"line_number":111,"context_line":"    to track the requested PCI devices in Placement. It can be a standard"},{"line_number":112,"context_line":"    resource class from the ``os-resource-classes`` lib. Or it can be an"}],"source_content_type":"text/x-python","patch_set":3,"id":"dcb976cc_10665a3a","line":109,"updated":"2026-04-17 13:29:51.000000000","message":"this is OK for groups and basically the only way to request a group if we are not adding the group_type filed to the alias as well (we don\u0027t have to as the RC encodes the group type)\n\n//later\n\nSome comments in the code refer to group_type in PCI alias. So we need to say explicitly if we support it or not. \n\n// later\n\nThe alias parsing code defines group_type in alias. So we need to doc it here. Also we need to define a precedence order between group_type and RC if both specified.","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":124,"context_line":"    Either the product_id and vendor_id or the resource_class field must be"},{"line_number":125,"context_line":"    provided in each alias."},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"  ``traits``"},{"line_number":128,"context_line":"    An optional comma separated list of Placement trait names requested to be"},{"line_number":129,"context_line":"    present on the resource provider that fulfills this alias. Each trait can"},{"line_number":130,"context_line":"    be a standard trait from ``os-traits`` lib or it can be an arbitrary"}],"source_content_type":"text/x-python","patch_set":3,"id":"d31cfc76_9602109c","line":127,"updated":"2026-04-17 13:29:51.000000000","message":"This is OK on the alias level, as it request a group with traits. But what traits a group of individual devices provides is a question. See below.","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":140,"context_line":"    include either a ``vendor_id``/``product_id`` pair or a ``resource_class``."},{"line_number":141,"context_line":"    An alias with only ``traits`` is not allowed."},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"  ``live_migratable``"},{"line_number":144,"context_line":"    Specify if live-migratable devices are desired."},{"line_number":145,"context_line":"    May have boolean-like string values case-insensitive values:"},{"line_number":146,"context_line":"    \"yes\" or \"no\"."}],"source_content_type":"text/x-python","patch_set":3,"id":"1b51c04d_28741a07","line":143,"updated":"2026-04-17 13:29:51.000000000","message":"requesting a live-migratable group make sense. A group will be live-migratable if all dcvices in the group is live-migratable.","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":224,"context_line":"    Additional ``\u003ctag\u003e`` and ``\u003ctag_value\u003e`` used for specifying PCI devices."},{"line_number":225,"context_line":"    Supported ``\u003ctag\u003e`` values are :"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"    - ``physical_network``"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"    - ``trusted``"},{"line_number":230,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"8e5799f0_2227af39","line":227,"updated":"2026-04-17 13:29:51.000000000","message":"devs with physical_network are not tracked in placement (yet). So if a group has a member device that is tagged with physical_network then that is a contradiction (as group only supported when PCI in Placement is in use for the devs). I need to check if this is correctly rejected and covered with a test case","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":226,"context_line":""},{"line_number":227,"context_line":"    - ``physical_network``"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"    - ``trusted``"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    - ``remote_managed`` - a VF is managed remotely by an off-path networking"},{"line_number":232,"context_line":"      backend. May have boolean-like string values case-insensitive values:"}],"source_content_type":"text/x-python","patch_set":3,"id":"38478611_968d1a2e","line":229,"updated":"2026-04-17 13:29:51.000000000","message":"What will happen if a device in a group tagged as trusted?","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":228,"context_line":""},{"line_number":229,"context_line":"    - ``trusted``"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    - ``remote_managed`` - a VF is managed remotely by an off-path networking"},{"line_number":232,"context_line":"      backend. May have boolean-like string values case-insensitive values:"},{"line_number":233,"context_line":"      \"true\" or \"false\". By default, \"false\" is assumed for all devices."},{"line_number":234,"context_line":"      Using this option requires a networking service backend capable of"}],"source_content_type":"text/x-python","patch_set":3,"id":"c59246fc_b32d26e7","line":231,"updated":"2026-04-17 13:29:51.000000000","message":"ditto. Can we add a remote_managed device to a group?","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":237,"context_line":"      its corresponding PF), otherwise they will be ignored and not"},{"line_number":238,"context_line":"      available for allocation."},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"    - ``managed`` - Specify if the PCI device is managed by libvirt."},{"line_number":241,"context_line":"      May have boolean-like string values case-insensitive values:"},{"line_number":242,"context_line":"      \"yes\" or \"no\". By default, \"yes\" is assumed for all devices."},{"line_number":243,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"103410bb_b8ed105a","line":240,"updated":"2026-04-17 13:29:51.000000000","message":"OK this should work with groupped devices. This flag has no meaning on the group level just on individual device level when we generate the domain XML.\n\nI hope we don\u0027t use this flag for scheduling ever as that would create a problem with a group having some managed an unmanaged devices mixed.","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":253,"context_line":"       Warning: Incorrect configuration of this parameter may result in compute"},{"line_number":254,"context_line":"       node crashes."},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"    - ``live_migratable`` - Specify if the PCI device is live_migratable by"},{"line_number":257,"context_line":"      libvirt."},{"line_number":258,"context_line":"      May have boolean-like string values case-insensitive values:"},{"line_number":259,"context_line":"      \"yes\" or \"no\". By default, \"no\" is assumed for all devices."}],"source_content_type":"text/x-python","patch_set":3,"id":"879bb2a9_5ed9243a","line":256,"updated":"2026-04-17 13:29:51.000000000","message":"I\u0027m pretty sure we are using this during scheduling. So we have to be able to answer the question. Is this VM live migratable having a PCI group? And the answer is: It is only live migratable if every device in the group is live migratable.\n\nThis means that probably we can allow a PCI group to be defined with mixed migratable and non migratable devices, but that makes the group and the user of that group non migratable.","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":264,"context_line":""},{"line_number":265,"context_line":"      - ``live_migratable\u003d\u0027no\u0027`` means that the device cannot be live migrated."},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"    - ``resource_class`` - optional Placement resource class name to be used"},{"line_number":268,"context_line":"      to track the matching PCI devices in Placement when"},{"line_number":269,"context_line":"      [pci]report_in_placement is True."},{"line_number":270,"context_line":"      It can be a standard resource class from the"}],"source_content_type":"text/x-python","patch_set":3,"id":"4f4f60c6_fd07b28f","line":267,"updated":"2026-04-17 13:29:51.000000000","message":"devices that are part of a group can have an explicit resource_class defined but that resource_class should be the same for all devices in the group definition. Otherwise it is a config error and we need to reject the config at startup. I need to check if we have test coverage.\n\nIf no RC is defined nova will generate one. Such generation should happen on the group level not on individual spec level.","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":278,"context_line":"      ``CUSTOM_PCI_{vendor_id}_{product_id}``."},{"line_number":279,"context_line":"      The ``resource_class`` can be requested from a ``[pci]alias``"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"    - ``traits`` - optional comma separated list of Placement trait names to"},{"line_number":282,"context_line":"      report on the resource provider that will represent the matching PCI"},{"line_number":283,"context_line":"      device. Each trait can be a standard trait from ``os-traits`` lib or can"},{"line_number":284,"context_line":"      be any string. If it is not a standard trait then Nova will normalize the"}],"source_content_type":"text/x-python","patch_set":3,"id":"f652fab1_a4fade81","line":281,"updated":"2026-04-17 13:29:51.000000000","message":"each device in the group can have its own set of traits defined. But there is no always-good automatic way to define the traits of a group consist of multiple devices with a list of traits. A diverse set of traits should mean:\n* a) config error. config only accepted if each device defines the same trait\n* b) the group will have the union of the individual trait lists\n* c) the group will have the intersection of the individual trait lists","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":288,"context_line":"      name is 255 character including the prefix."},{"line_number":289,"context_line":"      Any trait from ``traits`` can be requested from a ``[pci]alias``."},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"    - ``group_name`` - optional name identifying a specific PCI device group"},{"line_number":292,"context_line":"      instance. PCI device groups allow multiple PCI devices to be scheduled"},{"line_number":293,"context_line":"      and allocated as an indivisible unit. All devices in a group must have"},{"line_number":294,"context_line":"      the same ``group_name`` value."}],"source_content_type":"text/x-python","patch_set":3,"id":"dfbec49c_766c303d","line":291,"updated":"2026-04-17 13:29:51.000000000","message":"what happens if group_name is not specified? Will all devices with the same group_type added to the same group? Will the name of that single group be the same as the group_type and therefore the name of the RP in placement?\n\nThis feels like a non-future proof situation. Assume the user created this single group first without a name. Then later wants to create the second group with the same type. Will that work without a major pain?\n\n---\n\nor all this means that if you want groups you must specify both group_name and group_type. But of course you don\u0027t need to specify either of them if this is not a grouped device spec.\n\nWe need to be more precise here. And I also need to check the test coverage to see if we enforce this properly.","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":298,"context_line":""},{"line_number":299,"context_line":"      Example: ``\"group_name\": \"graphcore_1\"``"},{"line_number":300,"context_line":""},{"line_number":301,"context_line":"    - ``group_type`` - optional type/category name for a PCI device group."},{"line_number":302,"context_line":"      This is used to generate the Placement resource class for the group"},{"line_number":303,"context_line":"      in the form ``CUSTOM_PCI_GROUP_{group_type}``. All devices in the same"},{"line_number":304,"context_line":"      group must have the same ``group_type``."}],"source_content_type":"text/x-python","patch_set":3,"id":"d3c25c63_85f21704","line":301,"updated":"2026-04-17 13:29:51.000000000","message":"same optionality discrepancy as above.","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":301,"context_line":"    - ``group_type`` - optional type/category name for a PCI device group."},{"line_number":302,"context_line":"      This is used to generate the Placement resource class for the group"},{"line_number":303,"context_line":"      in the form ``CUSTOM_PCI_GROUP_{group_type}``. All devices in the same"},{"line_number":304,"context_line":"      group must have the same ``group_type``."},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"      When ``group_type`` is specified, ``group_name`` must also be specified."},{"line_number":307,"context_line":"      Each group must contain at least 2 devices."}],"source_content_type":"text/x-python","patch_set":3,"id":"42b3730d_be680f33","line":304,"updated":"2026-04-17 13:29:51.000000000","message":"I need to check if tests exists for that","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":315,"context_line":""},{"line_number":316,"context_line":"      - GPUs with paired graphics and audio functions"},{"line_number":317,"context_line":"      - Multi-device accelerator cards connected via proprietary interconnects"},{"line_number":318,"context_line":"        (e.g., Graphcore C200 IPU-Link connected cards)"},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"      Each PCI device can only belong to one group. When a group is allocated"},{"line_number":321,"context_line":"      to a VM, all devices in the group are assigned atomically."}],"source_content_type":"text/x-python","patch_set":3,"id":"80936a68_b098a8ca","line":318,"updated":"2026-04-17 13:29:51.000000000","message":"Do we want to mention Nvidia and AMD use cases here. I feel like Graphcore has a lower marketing value than NVLink","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":381,"context_line":""},{"line_number":382,"context_line":"    alias \u003d {\"name\": \"c200_x1\","},{"line_number":383,"context_line":"             \"resource_class\": \"CUSTOM_PCI_GROUP_C200_X1\","},{"line_number":384,"context_line":"             \"device_type\": \"type-PCI\"}"},{"line_number":385,"context_line":""},{"line_number":386,"context_line":"  The following are invalid, as they specify mutually exclusive options::"},{"line_number":387,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"f5cc6d06_8a33fc1e","line":384,"updated":"2026-04-17 13:29:51.000000000","message":"How device_type influences the picture? Can we mix VFs and PFs in the same group? What should be the device_type then?","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"}],"nova/pci/devspec.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":489,"context_line":"            \"managed\","},{"line_number":490,"context_line":"            \"live_migratable\","},{"line_number":491,"context_line":"            GROUP_NAME_TAG,"},{"line_number":492,"context_line":"            GROUP_TYPE_TAG,"},{"line_number":493,"context_line":"        ]"},{"line_number":494,"context_line":"        for tag in spec_tags:"},{"line_number":495,"context_line":"            tag_value \u003d self.tags.get(tag)"}],"source_content_type":"text/x-python","patch_set":3,"id":"bef407bf_afc01f1b","line":492,"updated":"2026-04-17 13:29:51.000000000","message":"OK so this will add the group_type and group_name to all PCIDevices that are coming from group dev_specs. Wondering if we need to do some compatibility code in the PCIDevice object to handle the newcommers","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"}],"nova/pci/manager.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":358,"context_line":""},{"line_number":359,"context_line":"        instance_uuid \u003d pci_requests.instance_uuid"},{"line_number":360,"context_line":"        for dev in devs:"},{"line_number":361,"context_line":"            if dev.extra_info.get(\u0027group_name\u0027):"},{"line_number":362,"context_line":"                # Device is from a PCI group (group_name set from device_spec"},{"line_number":363,"context_line":"                # config via enhanced_pci_device_with_spec_tags). Group devices"},{"line_number":364,"context_line":"                # bypass normal claim logic because a group may contain both a"},{"line_number":365,"context_line":"                # PF and its VFs, which cannot be claimed via the normal PF/VF"},{"line_number":366,"context_line":"                # dependency logic (normal claim: PF sets VFs to UNCLAIMABLE,"},{"line_number":367,"context_line":"                # but VF claim expects AVAILABLE status)."},{"line_number":368,"context_line":"                dev.status \u003d fields.PciDeviceStatus.CLAIMED"},{"line_number":369,"context_line":"                dev.instance_uuid \u003d instance_uuid"},{"line_number":370,"context_line":"            else:"},{"line_number":371,"context_line":"                dev.claim(instance_uuid)"},{"line_number":372,"context_line":"        if instance_numa_topology and any("},{"line_number":373,"context_line":"                                        dev.numa_node is None for dev in devs):"},{"line_number":374,"context_line":"            LOG.warning(\"Assigning a pci device without numa affinity to \""}],"source_content_type":"text/x-python","patch_set":3,"id":"d6ecfd7b_31a9beea","line":371,"range":{"start_line":361,"start_character":0,"end_line":371,"end_character":40},"updated":"2026-04-17 13:29:51.000000000","message":"I feel like this is somehow belong to the claim logic in PCIDevice otherwise we might repeat it","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":401,"context_line":""},{"line_number":402,"context_line":"        for dev in devs:"},{"line_number":403,"context_line":"            if dev.extra_info.get(\u0027group_name\u0027):"},{"line_number":404,"context_line":"                # Device is from a PCI group (group_name set from device_spec"},{"line_number":405,"context_line":"                # config via enhanced_pci_device_with_spec_tags). Group devices"},{"line_number":406,"context_line":"                # bypass normal allocate logic because a group may contain both"},{"line_number":407,"context_line":"                # a PF and its VFs, which cannot be allocated via the normal"},{"line_number":408,"context_line":"                # PF/VF dependency logic (normal allocate: PF checks that all"},{"line_number":409,"context_line":"                # VFs are AVAILABLE/UNCLAIMABLE, but VF is CLAIMED from group)."},{"line_number":410,"context_line":"                dev.status \u003d fields.PciDeviceStatus.ALLOCATED"},{"line_number":411,"context_line":"                dev.instance_uuid \u003d instance[\u0027uuid\u0027]"},{"line_number":412,"context_line":"                # Add to instance\u0027s pci_devices list (matching normal behavior)"},{"line_number":413,"context_line":"                if isinstance(instance, dict):"}],"source_content_type":"text/x-python","patch_set":3,"id":"1010773b_a3600390","line":410,"range":{"start_line":404,"start_character":0,"end_line":410,"end_character":61},"updated":"2026-04-17 13:29:51.000000000","message":"...  duplication like this.","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"}],"nova/pci/request.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":116,"context_line":"        \"live_migratable\": {"},{"line_number":117,"context_line":"            \"type\": \"string\","},{"line_number":118,"context_line":"        },"},{"line_number":119,"context_line":"        \"group_type\": {"},{"line_number":120,"context_line":"            \"type\": \"string\","},{"line_number":121,"context_line":"            \"minLength\": 1,"},{"line_number":122,"context_line":"            \"maxLength\": 64,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9baaa95d_c23bb15b","line":119,"updated":"2026-04-17 13:29:51.000000000","message":"this is undocumented in the config doc","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":147,"context_line":"        for name, alias in aliases.items():"},{"line_number":148,"context_line":"            for spec in alias[1]:"},{"line_number":149,"context_line":"                ids \u003d \"vendor_id\" in spec and \"product_id\" in spec"},{"line_number":150,"context_line":"                rc \u003d \"resource_class\" in spec"},{"line_number":151,"context_line":"                # group_type implies resource_class was auto-generated"},{"line_number":152,"context_line":"                gt \u003d \"group_type\" in spec"},{"line_number":153,"context_line":"                if not ids and not rc and not gt:"},{"line_number":154,"context_line":"                    alias_without_ids_or_rc.add(name)"},{"line_number":155,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"1b0dc575_8bf1b602","line":152,"range":{"start_line":150,"start_character":0,"end_line":152,"end_character":41},"updated":"2026-04-17 13:29:51.000000000","message":"I guess we need another check when both the group_type and the resource_class is defined. Or at least document (implement and test) a precedence order.","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":222,"context_line":"            # Handle group_type: auto-generate resource_class if not provided"},{"line_number":223,"context_line":"            group_type \u003d spec.get(\u0027group_type\u0027)"},{"line_number":224,"context_line":"            if group_type:"},{"line_number":225,"context_line":"                # Validate that group_type is not used with"},{"line_number":226,"context_line":"                # vendor_id/product_id"},{"line_number":227,"context_line":"                if \u0027vendor_id\u0027 in spec or \u0027product_id\u0027 in spec:"},{"line_number":228,"context_line":"                    reason \u003d _("},{"line_number":229,"context_line":"                        \"group_type cannot be used with vendor_id/product_id \""},{"line_number":230,"context_line":"                        \"in alias \u0027%s\u0027\""},{"line_number":231,"context_line":"                    ) % name"},{"line_number":232,"context_line":"                    raise exception.PciInvalidAlias(reason\u003dreason)"},{"line_number":233,"context_line":"                # Auto-generate resource_class if not explicitly provided"},{"line_number":234,"context_line":"                if \u0027resource_class\u0027 not in spec:"},{"line_number":235,"context_line":"                    spec[\u0027resource_class\u0027] \u003d ("}],"source_content_type":"text/x-python","patch_set":3,"id":"375e1049_31e6b5e4","line":232,"range":{"start_line":225,"start_character":0,"end_line":232,"end_character":66},"updated":"2026-04-17 13:29:51.000000000","message":"Can we have this as a separate validator like the ones you extended above to follow the structure?","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":231,"context_line":"                    ) % name"},{"line_number":232,"context_line":"                    raise exception.PciInvalidAlias(reason\u003dreason)"},{"line_number":233,"context_line":"                # Auto-generate resource_class if not explicitly provided"},{"line_number":234,"context_line":"                if \u0027resource_class\u0027 not in spec:"},{"line_number":235,"context_line":"                    spec[\u0027resource_class\u0027] \u003d ("},{"line_number":236,"context_line":"                        f\"CUSTOM_PCI_GROUP_{group_type.upper()}\""},{"line_number":237,"context_line":"                    )"}],"source_content_type":"text/x-python","patch_set":3,"id":"b2e8ea4f_073e5921","line":234,"updated":"2026-04-17 13:29:51.000000000","message":"as above, what if both rc and group_type is in the spec?","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":230,"context_line":"                        \"in alias \u0027%s\u0027\""},{"line_number":231,"context_line":"                    ) % name"},{"line_number":232,"context_line":"                    raise exception.PciInvalidAlias(reason\u003dreason)"},{"line_number":233,"context_line":"                # Auto-generate resource_class if not explicitly provided"},{"line_number":234,"context_line":"                if \u0027resource_class\u0027 not in spec:"},{"line_number":235,"context_line":"                    spec[\u0027resource_class\u0027] \u003d ("},{"line_number":236,"context_line":"                        f\"CUSTOM_PCI_GROUP_{group_type.upper()}\""},{"line_number":237,"context_line":"                    )"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"            if name not in aliases:"},{"line_number":240,"context_line":"                aliases[name] \u003d (numa_policy, [spec])"}],"source_content_type":"text/x-python","patch_set":3,"id":"6a2a77bf_57b6e709","line":237,"range":{"start_line":233,"start_character":0,"end_line":237,"end_character":21},"updated":"2026-04-17 13:29:51.000000000","message":"I guess we have a similar code on the device_spec side to generate RC from group_type. Lets have a common code handling both to avoid divergence","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"}],"nova/pci/stats.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":108,"context_line":"    def _find_pool(self, dev_pool: Pool) -\u003e Pool | None:"},{"line_number":109,"context_line":"        \"\"\"Return the first pool that matches dev.\"\"\""},{"line_number":110,"context_line":"        # For group pools, match by group_name which is unique per group"},{"line_number":111,"context_line":"        if \u0027group_name\u0027 in dev_pool:"},{"line_number":112,"context_line":"            for pool in self.pools:"},{"line_number":113,"context_line":"                if pool.get(\u0027group_name\u0027) \u003d\u003d dev_pool[\u0027group_name\u0027]:"},{"line_number":114,"context_line":"                    return pool"},{"line_number":115,"context_line":"            return None"},{"line_number":116,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"e0edc3c0_3ce0ab6b","line":113,"range":{"start_line":111,"start_character":1,"end_line":113,"end_character":68},"updated":"2026-04-17 13:29:51.000000000","message":"if group_name is in dev_pool but the value of it is None then pool.get(\u0027group_name\u0027) returning None by default will cause a match.\n\nCan we define how the pools look in each case?\nI.e. a pool either has a group_name field that is not None. Or it does not have such field at all. \nOr alternatively a group_name \u003d None pool as not being a group?\n\nWhen we have such definiton can we start using _is_group_pool() consistently instead of re-implementing them in each check in various ways?","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":117,"context_line":"        # For non-group pools, use the standard matching logic"},{"line_number":118,"context_line":"        for pool in self.pools:"},{"line_number":119,"context_line":"            # Skip group pools when looking for non-group matches"},{"line_number":120,"context_line":"            if pool.get(\u0027group_name\u0027):"},{"line_number":121,"context_line":"                continue"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"            pool_keys \u003d pool.copy()"}],"source_content_type":"text/x-python","patch_set":3,"id":"e04c5705_e72931b1","line":120,"updated":"2026-04-17 13:29:51.000000000","message":"```\nif _is_group_pool(\u0027group_name\u0027):\n    continue\n```","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":183,"context_line":"            pool \u003d {"},{"line_number":184,"context_line":"                \u0027group_name\u0027: group_name,"},{"line_number":185,"context_line":"                \u0027group_type\u0027: tags.get(\u0027group_type\u0027),"},{"line_number":186,"context_line":"                \u0027vendor_id\u0027: dev.vendor_id,"},{"line_number":187,"context_line":"                \u0027product_id\u0027: dev.product_id,"},{"line_number":188,"context_line":"                \u0027numa_node\u0027: dev.numa_node,"},{"line_number":189,"context_line":"            }"},{"line_number":190,"context_line":"            # Include any other non-ignored tags"},{"line_number":191,"context_line":"            pool.update("}],"source_content_type":"text/x-python","patch_set":3,"id":"b8ba1154_8c99292d","line":188,"range":{"start_line":186,"start_character":0,"end_line":188,"end_character":43},"updated":"2026-04-17 13:29:51.000000000","message":"What will be the value of these if the devs in the pool has divers values for these fields?","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":196,"context_line":"                    k not in (\u0027group_name\u0027, \u0027group_type\u0027)"},{"line_number":197,"context_line":"                }"},{"line_number":198,"context_line":"            )"},{"line_number":199,"context_line":"            return pool"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"        pool \u003d {k: getattr(dev, k) for k in self.pool_keys}"},{"line_number":202,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"120aa704_007d131e","line":199,"updated":"2026-04-17 13:29:51.000000000","message":"This is almost like two separate function depending on if the pool is a group pool or not.","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":286,"context_line":""},{"line_number":287,"context_line":"        A group is only live migratable if ALL devices in it have"},{"line_number":288,"context_line":"        live_migratable\u003d\u0027true\u0027. If any device does not have live_migratable"},{"line_number":289,"context_line":"        set to \u0027true\u0027, the pool should reflect the most restrictive value."},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"        :param pool: The existing pool to potentially update"},{"line_number":292,"context_line":"        :param dev_pool: The pool keys for the device being added"}],"source_content_type":"text/x-python","patch_set":3,"id":"ea726151_4fc66f39","line":289,"updated":"2026-04-17 13:29:51.000000000","message":"OK. I agree.","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":377,"context_line":""},{"line_number":378,"context_line":"        Note: We do NOT call _handle_device_dependents here because:"},{"line_number":379,"context_line":"        1. All devices in the group are explicitly allocated together"},{"line_number":380,"context_line":"        2. PF/VF relationships within a group are intentional - they should"},{"line_number":381,"context_line":"           all be allocated as a unit, not have VFs removed when a PF is"},{"line_number":382,"context_line":"           allocated"},{"line_number":383,"context_line":"        3. Calling _handle_device_dependents would remove VFs from the pool"},{"line_number":384,"context_line":"           before we pop them, causing them to be lost"},{"line_number":385,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"309b8be9_c3aaa649","line":382,"range":{"start_line":380,"start_character":0,"end_line":382,"end_character":20},"updated":"2026-04-17 13:29:51.000000000","message":"OK that is an interesting point. I don\u0027t think today with PCI in Placement we can create a pool where both the PF and its VFs are included as those dependent devices cannot match at the same time to dev_spec, due to the limitation of PCI in Placement. I need to check if this patch removes such limitation in the correct way.\n\nIn the other hand what if a PF is part of a group and its child VF is also in the dev_spec but not part of the group. I guess we still want to reject that case.","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":451,"context_line":"                        # For group pools, allocate all devices in the group"},{"line_number":452,"context_line":"                        # as an atomic unit. Placement has inventory of 1 for"},{"line_number":453,"context_line":"                        # the entire group, so we consume all devices."},{"line_number":454,"context_line":"                        alloc_devices +\u003d self._allocate_group("},{"line_number":455,"context_line":"                            pool, request.request_id)"},{"line_number":456,"context_line":"                    else:"},{"line_number":457,"context_line":"                        count \u003d requested_devs_per_pool_rp[pool[\u0027rp_uuid\u0027]]"}],"source_content_type":"text/x-python","patch_set":3,"id":"5d616765_d980b24e","line":454,"updated":"2026-04-17 13:29:51.000000000","message":"Can it be that the request we are fulfilling here asks for two groups from the same type? I.e. request.count\u003e1. If so then we need to maintain that count while allocating one group to this request.","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"107f8d684015126ea462f96026406cf3279a4ffc","unresolved":true,"context_lines":[{"line_number":451,"context_line":"                        # For group pools, allocate all devices in the group"},{"line_number":452,"context_line":"                        # as an atomic unit. Placement has inventory of 1 for"},{"line_number":453,"context_line":"                        # the entire group, so we consume all devices."},{"line_number":454,"context_line":"                        alloc_devices +\u003d self._allocate_group("},{"line_number":455,"context_line":"                            pool, request.request_id)"},{"line_number":456,"context_line":"                    else:"},{"line_number":457,"context_line":"                        count \u003d requested_devs_per_pool_rp[pool[\u0027rp_uuid\u0027]]"}],"source_content_type":"text/x-python","patch_set":3,"id":"6e64e4d1_744b2f4c","line":454,"in_reply_to":"5d616765_d980b24e","updated":"2026-05-05 15:40:14.000000000","message":"I guess this goes back to how we form InstancePCIRequest from the alias. There we probably split to multiple requests instead of having a request with a count\u003e1","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":527,"context_line":"        self,"},{"line_number":528,"context_line":"        pool: Pool,"},{"line_number":529,"context_line":"        numa_cell_ids: ty.List[ty.Optional[int]],"},{"line_number":530,"context_line":"        strict: bool \u003d True,"},{"line_number":531,"context_line":"    ) -\u003e bool:"},{"line_number":532,"context_line":"        \"\"\"Check if a group pool has NUMA affinity with the given cells."},{"line_number":533,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"d73d5807_d6702b4a","line":530,"updated":"2026-04-17 13:29:51.000000000","message":"as far as I see callers always pass strict\u003dTrue. Is this a bug that we are never checking non strictness or we just have dead code here?","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":566,"context_line":"        :returns: Number of devices with NUMA affinity"},{"line_number":567,"context_line":"        \"\"\""},{"line_number":568,"context_line":"        devices \u003d pool.get(\u0027devices\u0027, [])"},{"line_number":569,"context_line":"        return sum(1 for dev in devices if dev.numa_node in numa_cell_ids)"},{"line_number":570,"context_line":""},{"line_number":571,"context_line":"    def _filter_non_group_pool_for_numa("},{"line_number":572,"context_line":"        self,"}],"source_content_type":"text/x-python","patch_set":3,"id":"b155ff2f_308dcf61","line":569,"updated":"2026-04-17 13:29:51.000000000","message":"this is not a normalized value for the size of the group. So I guess this assumes that the size of a group is the same within the same group type. If so we should enforce it","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":647,"context_line":"        # affinity will fulfil LEGACY but not SOCKET. If we have SOCKET,"},{"line_number":648,"context_line":"        # process it here and don\u0027t continue."},{"line_number":649,"context_line":"        if requested_policy \u003d\u003d fields.PCINUMAAffinityPolicy.SOCKET:"},{"line_number":650,"context_line":"            return self._filter_pools_for_socket_affinity(pools, numa_cells)"},{"line_number":651,"context_line":""},{"line_number":652,"context_line":"        # some systems don\u0027t report NUMA node info for PCI devices, in which"},{"line_number":653,"context_line":"        # case None is reported in \u0027pci_device.numa_node\u0027. The LEGACY policy"}],"source_content_type":"text/x-python","patch_set":3,"id":"629f83eb_3a8dffbd","line":650,"updated":"2026-04-17 13:29:51.000000000","message":"I see that groups are handled within the call itself.","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"107f8d684015126ea462f96026406cf3279a4ffc","unresolved":false,"context_lines":[{"line_number":647,"context_line":"        # affinity will fulfil LEGACY but not SOCKET. If we have SOCKET,"},{"line_number":648,"context_line":"        # process it here and don\u0027t continue."},{"line_number":649,"context_line":"        if requested_policy \u003d\u003d fields.PCINUMAAffinityPolicy.SOCKET:"},{"line_number":650,"context_line":"            return self._filter_pools_for_socket_affinity(pools, numa_cells)"},{"line_number":651,"context_line":""},{"line_number":652,"context_line":"        # some systems don\u0027t report NUMA node info for PCI devices, in which"},{"line_number":653,"context_line":"        # case None is reported in \u0027pci_device.numa_node\u0027. The LEGACY policy"}],"source_content_type":"text/x-python","patch_set":3,"id":"61f1b3e6_45229ef1","line":650,"in_reply_to":"629f83eb_3a8dffbd","updated":"2026-05-05 15:40:14.000000000","message":"Done","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":892,"context_line":"        \"\"\"Filter out group pools unless a group is explicitly requested."},{"line_number":893,"context_line":""},{"line_number":894,"context_line":"        PCI device groups must be explicitly requested via an alias with"},{"line_number":895,"context_line":"        group_type or resource_class matching CUSTOM_PCI_GROUP_*. Non-group"},{"line_number":896,"context_line":"        requests should not be able to claim devices that are part of a group,"},{"line_number":897,"context_line":"        even if the vendor_id/product_id matches."},{"line_number":898,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"828e6238_fc16cc0e","line":895,"range":{"start_line":895,"start_character":8,"end_line":895,"end_character":65},"updated":"2026-04-17 13:29:51.000000000","message":"are we adding group_type to the alias? It is missing from the conf doc at least","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"107f8d684015126ea462f96026406cf3279a4ffc","unresolved":true,"context_lines":[{"line_number":892,"context_line":"        \"\"\"Filter out group pools unless a group is explicitly requested."},{"line_number":893,"context_line":""},{"line_number":894,"context_line":"        PCI device groups must be explicitly requested via an alias with"},{"line_number":895,"context_line":"        group_type or resource_class matching CUSTOM_PCI_GROUP_*. Non-group"},{"line_number":896,"context_line":"        requests should not be able to claim devices that are part of a group,"},{"line_number":897,"context_line":"        even if the vendor_id/product_id matches."},{"line_number":898,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"d74fc63a_28d8ce88","line":895,"range":{"start_line":895,"start_character":8,"end_line":895,"end_character":65},"in_reply_to":"828e6238_fc16cc0e","updated":"2026-05-05 15:40:14.000000000","message":"yes we do. This is a doc issue","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":903,"context_line":"            this is possible."},{"line_number":904,"context_line":"        \"\"\""},{"line_number":905,"context_line":"        # Check if any spec in the request explicitly targets a group"},{"line_number":906,"context_line":"        request_targets_group \u003d any("},{"line_number":907,"context_line":"            spec.get(\u0027group_name\u0027) or spec.get(\u0027group_type\u0027)"},{"line_number":908,"context_line":"            for spec in request.spec"},{"line_number":909,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":3,"id":"da02144a_847c7486","line":906,"updated":"2026-04-17 13:29:51.000000000","message":"can a request target groups and individual devices at the same time? \n\nIf yes then how will we prevent that such request starts allocating devs from groups for the individual request.\n\nIf no, and a request either targets a group or targets individual devs than this code can be sturctured that either returning just group pool or just non-group pools but never both.","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"107f8d684015126ea462f96026406cf3279a4ffc","unresolved":true,"context_lines":[{"line_number":903,"context_line":"            this is possible."},{"line_number":904,"context_line":"        \"\"\""},{"line_number":905,"context_line":"        # Check if any spec in the request explicitly targets a group"},{"line_number":906,"context_line":"        request_targets_group \u003d any("},{"line_number":907,"context_line":"            spec.get(\u0027group_name\u0027) or spec.get(\u0027group_type\u0027)"},{"line_number":908,"context_line":"            for spec in request.spec"},{"line_number":909,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":3,"id":"22d5f209_94aaad62","line":906,"in_reply_to":"da02144a_847c7486","updated":"2026-05-05 15:40:14.000000000","message":"probably not but due to InstancePCIRequest splitting but I need to double check","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":1166,"context_line":"            for pool in filtered_pools:"},{"line_number":1167,"context_line":"                if self._is_group_pool(pool):"},{"line_number":1168,"context_line":"                    # For group pools, placement allocates 1 unit for the"},{"line_number":1169,"context_line":"                    # entire group, but pool[\u0027count\u0027] is the number of devices."},{"line_number":1170,"context_line":"                    # We consume the whole group atomically, so set count to 0."},{"line_number":1171,"context_line":"                    pool[\u0027count\u0027] \u003d 0"},{"line_number":1172,"context_line":"                else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"fb7ca2ca_da11d5c4","line":1169,"updated":"2026-04-17 13:29:51.000000000","message":"Does the request for pools always one one group and never multiple groups? Do we have to track how much of the request\u0027s count is satisfied?","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"}],"nova/pci/utils.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"def pci_device_prop_match("},{"line_number":41,"context_line":"    pci_dev: \u0027stats.Pool\u0027, specs: list[dict[str, str | int | None]],"},{"line_number":42,"context_line":") -\u003e bool:"},{"line_number":43,"context_line":"    \"\"\"Check if the pci_dev meet spec requirement"},{"line_number":44,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"81aa5200_53d1da8a","line":41,"updated":"2026-04-17 13:29:51.000000000","message":"is this fixing a bug in the baseline or this patch extends the possible values? I really which this review would be split up to smaller steps","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    \"\"\""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def _matching_devices(spec: dict[str, str | int | None]) -\u003e bool:"},{"line_number":57,"context_line":"        for k, v in spec.items():"},{"line_number":58,"context_line":"            pci_dev_v \u003d pci_dev.get(k)"},{"line_number":59,"context_line":"            if isinstance(v, list) and isinstance(pci_dev_v, list):"}],"source_content_type":"text/x-python","patch_set":3,"id":"e9f36b2c_40da5ba3","line":56,"updated":"2026-04-17 13:29:51.000000000","message":"ditto","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"}],"nova/pci/whitelist.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"8dd85739a75bf726628d7222628618faf34437ca","unresolved":true,"context_lines":[{"line_number":143,"context_line":""},{"line_number":144,"context_line":"        for group_name, specs in groups.items():"},{"line_number":145,"context_line":"            # Validate group has at least 2 devices"},{"line_number":146,"context_line":"            if len(specs) \u003c 2:"},{"line_number":147,"context_line":"                raise exception.PciConfigInvalidSpec("},{"line_number":148,"context_line":"                    reason\u003d_(\"PCI group \u0027%(group_name)s\u0027 must have at least \""},{"line_number":149,"context_line":"                             \"2 devices, but only has %(count)d\") %"}],"source_content_type":"text/x-python","patch_set":2,"id":"e417d0fe_c52d1059","line":146,"updated":"2026-01-23 16:17:11.000000000","message":"this is incorrect\n\n it does not take into account that we supprot regex and bash globs \n \n this shoudl pass but it currently fials.\n``` \n [pci]\nreport_in_placement \u003d True\n\n# Group 1: 3b:02.0 - 3b:02.7\ndevice_spec \u003d {\"address\": \"0000:3b:02.0\", \"group_name\": \"nic_group_1\", \"group_type\": \"NICx8\"}\ndevice_spec \u003d {\"address\": \"0000:3b:02.1\", \"group_name\": \"nic_group_1\", \"group_type\": \"NICx8\"}\ndevice_spec \u003d {\"address\": \"0000:3b:02.2\", \"group_name\": \"nic_group_1\", \"group_type\": \"NICx8\"}\ndevice_spec \u003d {\"address\": \"0000:3b:02.3\", \"group_name\": \"nic_group_1\", \"group_type\": \"NICx8\"}\ndevice_spec \u003d {\"address\": \"0000:3b:02.4\", \"group_name\": \"nic_group_1\", \"group_type\": \"NICx8\"}\ndevice_spec \u003d {\"address\": \"0000:3b:02.5\", \"group_name\": \"nic_group_1\", \"group_type\": \"NICx8\"}\ndevice_spec \u003d {\"address\": \"0000:3b:02.6\", \"group_name\": \"nic_group_1\", \"group_type\": \"NICx8\"}\ndevice_spec \u003d {\"address\": \"0000:3b:02.7\", \"group_name\": \"nic_group_1\", \"group_type\": \"NICx8\"}\n\n# Group 2: 3b:03.0 - 3b:03.7\ndevice_spec \u003d {\"address\": \"0000:3b:03.*\", \"group_name\": \"nic_group_2\", \"group_type\": \"NICx8\"}\n\n# Group 3: 3b:04.0 - 3b:04.7\ndevice_spec \u003d {\"address\": \"0000:3b:04.*\", \"group_name\": \"nic_group_3\", \"group_type\": \"NICx8\"}\n\n# Group 4: 3b:05.0 - 3b:05.7\ndevice_spec \u003d {\"address\": \"0000:3b:05.*\", \"group_name\": \"nic_group_4\", \"group_type\": \"NICx8\"}\n\n# Group 5: 3b:06.0 - 3b:06.7\ndevice_spec \u003d {\"address\": \"0000:3b:06.*\", \"group_name\": \"nic_group_5\", \"group_type\": \"NICx8\"}\n\n# Group 6: 3b:07.0 - 3b:07.7\ndevice_spec \u003d {\"address\": \"0000:3b:07.*\", \"group_name\": \"nic_group_6\", \"group_type\": \"NICx8\"}\n\n# Group 7: 3b:08.0 - 3b:08.7\ndevice_spec \u003d {\"address\": \"0000:3b:08.*\", \"group_name\": \"nic_group_7\", \"group_type\": \"NICx8\"}\n\n# Group 8: 3b:09.0 - 3b:09.7\ndevice_spec \u003d {\"address\": {\"domain\": \"0000\", \"bus\": \"3b\", \"slot\": \"09\", \"function\": \".*\"}, \"group_name\": \"nic_group_8\", \"group_type\": \"NICx8\"}\n\n# Alias for requesting NICx8 groups via flavor\nalias \u003d {\"name\": \"NICx8\", \"resource_class\": \"CUSTOM_PCI_GROUP_NICX8\"}\n```","commit_id":"85df4e06e4ae49d8c972550a422f37f2be649e54"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":155,"context_line":"        Validates that:"},{"line_number":156,"context_line":"        - Each group has at least 2 devices"},{"line_number":157,"context_line":"        - All specs in a group have the same group_type"},{"line_number":158,"context_line":"        - No device address appears in multiple groups"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"        :raises: PciConfigInvalidSpec if validation fails"},{"line_number":161,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"3bc015ee_652bd784","line":158,"updated":"2026-04-17 13:29:51.000000000","message":"* We might need to handle parent - child devices across different groups or across a group and ungroupped devices\n\n* divergence of RC and group_type across specs for the same group or even across different groups of the same type.\n\n* something about the traits if we agree what to do with them if they diverge\n\n* size of the group across a group type. Ie two group of the same type should have the same size. (the code sort of assumes it). However it might make growing groups in a group_type hard as they need to grow together in a lock step.\n\n* divergence of one_time_use flag within the group\n\n* Do we need to do anyting about trusted, remove_managed, and physical_network tags in devs within a group?","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":199,"context_line":"            for spec in specs:"},{"line_number":200,"context_line":"                # Get the address from the original config"},{"line_number":201,"context_line":"                address \u003d spec.dev_spec_conf.get(\u0027address\u0027)"},{"line_number":202,"context_line":"                devname \u003d spec.dev_spec_conf.get(\u0027devname\u0027)"},{"line_number":203,"context_line":"                # Address can be a dict (for patterns) or a string"},{"line_number":204,"context_line":"                if isinstance(address, dict):"},{"line_number":205,"context_line":"                    addr_key \u003d str(sorted(address.items()))"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a89693f_fca6bf63","line":202,"updated":"2026-04-17 13:29:51.000000000","message":"PCI in Placement does not support devname","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"}],"nova/tests/functional/libvirt/test_pci_in_placement.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"9ae777041ee45717acd0534cdd5738c18d502a86","unresolved":true,"context_lines":[{"line_number":2520,"context_line":"                },"},{"line_number":2521,"context_line":"            ]"},{"line_number":2522,"context_line":"        )"},{"line_number":2523,"context_line":"        self.flags("},{"line_number":2524,"context_line":"    group\u003d\u0027pci\u0027,"},{"line_number":2525,"context_line":"    device_spec\u003ddevice_spec,"},{"line_number":2526,"context_line":"     report_in_placement\u003dTrue)"},{"line_number":2527,"context_line":"        self.start_compute(hostname\u003d\"compute1\", pci_info\u003dpci_info)"},{"line_number":2528,"context_line":""},{"line_number":2529,"context_line":"        # The group should be reported as a single RP"}],"source_content_type":"text/x-python","patch_set":1,"id":"2c9f4651_ded016c9","line":2526,"range":{"start_line":2523,"start_character":7,"end_line":2526,"end_character":30},"updated":"2026-01-16 14:26:31.000000000","message":"technially this is pep8 complent but its ungly so i shoudl fix this","commit_id":"0fb12cb9781878200323447da95a456e12881a7f"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"9ae777041ee45717acd0534cdd5738c18d502a86","unresolved":true,"context_lines":[{"line_number":2529,"context_line":"        # The group should be reported as a single RP"},{"line_number":2530,"context_line":"        # with resource class CUSTOM_PCI_GROUP_GPU_PAIR"},{"line_number":2531,"context_line":"        compute_rp_uuid \u003d self.compute_rp_uuids[\"compute1\"]"},{"line_number":2532,"context_line":"        group_rp_name \u003d \"compute1_group_GPU_PAIR_1\""},{"line_number":2533,"context_line":""},{"line_number":2534,"context_line":"        # Check that the group RP exists as a child of compute RP"},{"line_number":2535,"context_line":"        group_rps \u003d self._get_all_rps_in_a_tree(compute_rp_uuid)"}],"source_content_type":"text/x-python","patch_set":1,"id":"29cf8f7f_ca6d501c","line":2532,"updated":"2026-01-16 14:26:31.000000000","message":"also i shoudl fix the generation fo the name to be lowercase","commit_id":"0fb12cb9781878200323447da95a456e12881a7f"}],"nova/tests/unit/compute/test_pci_placement_translator.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"9ae777041ee45717acd0534cdd5738c18d502a86","unresolved":true,"context_lines":[{"line_number":657,"context_line":""},{"line_number":658,"context_line":"    def setUp(self):"},{"line_number":659,"context_line":"        super().setUp()"},{"line_number":660,"context_line":"        patcher \u003d mock.patch("},{"line_number":661,"context_line":"            \"nova.compute.pci_placement_translator.\""},{"line_number":662,"context_line":"            \"_is_placement_tracking_enabled\")"},{"line_number":663,"context_line":"        self.addCleanup(patcher.stop)"},{"line_number":664,"context_line":"        patcher.start()"},{"line_number":665,"context_line":""},{"line_number":666,"context_line":"    def test_group_rp_inventory_is_one(self):"},{"line_number":667,"context_line":"        \"\"\"Test that group RP inventory is always 1.\"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"81028add_9c6dc372","line":664,"range":{"start_line":660,"start_character":6,"end_line":664,"end_character":23},"updated":"2026-01-16 14:26:31.000000000","message":"this should use the fixture lib and the mock patch fixutre","commit_id":"0fb12cb9781878200323447da95a456e12881a7f"}],"nova/virt/hardware.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fadc2c13dbb793819419e7ebb00dbb9e475dd6df","unresolved":true,"context_lines":[{"line_number":2609,"context_line":"                # PciDeviceStats._group_pool_has_numa_affinity()"},{"line_number":2610,"context_line":"                if pool.get(\u0027group_name\u0027):"},{"line_number":2611,"context_line":"                    continue"},{"line_number":2612,"context_line":"                numa_node \u003d pool.get(\u0027numa_node\u0027)"},{"line_number":2613,"context_line":"                if numa_node is None:"},{"line_number":2614,"context_line":"                    continue"},{"line_number":2615,"context_line":"                if numa_node in total_pci_in_cell:"},{"line_number":2616,"context_line":"                    total_pci_in_cell[numa_node] +\u003d pool[\u0027count\u0027]"},{"line_number":2617,"context_line":"                else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"94ac5ba9_7447d85c","line":2614,"range":{"start_line":2612,"start_character":0,"end_line":2614,"end_character":28},"updated":"2026-04-17 13:29:51.000000000","message":"This different from baseline where not having a numa_node field on the pool was a key error now the such pool is skipped. Do we really need this difference in behavior. Did we changed when a pool has numa_node key?","commit_id":"7c4bcba6c534e65ab4fd669b5ab0479275dfb1b4"}]}
