def _generate_min_capability()

in lisa/sut_orchestrator/azure/features.py [0:0]


    def _generate_min_capability(self, capability: Any) -> Any:
        assert isinstance(
            capability, AzureDiskOptionSettings
        ), f"actual: {type(capability)}"

        assert (
            capability.disk_type
        ), "capability should have at least one disk type, but it's None"
        min_value = AzureDiskOptionSettings()
        cap_disk_type = capability.disk_type
        if isinstance(cap_disk_type, search_space.SetSpace):
            assert (
                len(cap_disk_type) > 0
            ), "capability should have at least one disk type, but it's empty"
        elif isinstance(cap_disk_type, schema.DiskType):
            cap_disk_type = search_space.SetSpace[schema.DiskType](
                is_allow_set=True, items=[cap_disk_type]
            )
        else:
            raise LisaException(
                f"unknown disk type on capability, type: {cap_disk_type}"
            )

        min_value.disk_type = (
            search_space.generate_min_capability_setspace_from_priority(
                self.disk_type, capability.disk_type, _ordered_disk_types
            )
        )

        # below values affect data disk only.
        if self.data_disk_count is not None or capability.data_disk_count is not None:
            min_value.data_disk_count = search_space.generate_min_capability_countspace(
                self.data_disk_count, capability.data_disk_count
            )

        if (
            self.max_data_disk_count is not None
            or capability.max_data_disk_count is not None
        ):
            min_value.max_data_disk_count = (
                search_space.generate_min_capability_countspace(
                    self.max_data_disk_count, capability.max_data_disk_count
                )
            )

        disk_type_iops = _disk_size_iops_map.get(min_value.disk_type, None)
        # ignore unsupported disk type like Ephemeral. It supports only os
        # disk. Calculate for iops, if it has value. If not, try disk size
        if disk_type_iops:
            if self.data_disk_iops:
                req_disk_iops = search_space.count_space_to_int_range(
                    self.data_disk_iops
                )
                cap_disk_iops = search_space.count_space_to_int_range(
                    capability.data_disk_iops
                )
                min_iops = max(req_disk_iops.min, cap_disk_iops.min)
                max_iops = min(req_disk_iops.max, cap_disk_iops.max)

                min_value.data_disk_iops = min(
                    iops
                    for iops, _ in disk_type_iops
                    if iops >= min_iops and iops <= max_iops
                )
                min_value.data_disk_size = self._get_disk_size_from_iops(
                    min_value.data_disk_iops, disk_type_iops
                )
            elif self.data_disk_size:
                req_disk_size = search_space.count_space_to_int_range(
                    self.data_disk_size
                )
                cap_disk_size = search_space.count_space_to_int_range(
                    capability.data_disk_size
                )
                min_size = max(req_disk_size.min, cap_disk_size.min)
                max_size = min(req_disk_size.max, cap_disk_size.max)

                min_value.data_disk_iops = min(
                    iops
                    for iops, disk_size in disk_type_iops
                    if disk_size >= min_size and disk_size <= max_size
                )
                min_value.data_disk_size = self._get_disk_size_from_iops(
                    min_value.data_disk_iops, disk_type_iops
                )
            else:
                # if req is not specified, query minimum value.
                cap_disk_size = search_space.count_space_to_int_range(
                    capability.data_disk_size
                )
                min_value.data_disk_iops = min(
                    iops
                    for iops, _ in disk_type_iops
                    if iops >= cap_disk_size.min and iops <= cap_disk_size.max
                )
                min_value.data_disk_size = self._get_disk_size_from_iops(
                    min_value.data_disk_iops, disk_type_iops
                )
        else:
            # The Ephemeral doesn't support data disk, but it needs a value.
            min_value.data_disk_iops = 0
            min_value.data_disk_size = 0

        # all caching types are supported, so just take the value from requirement.
        min_value.data_disk_caching_type = self.data_disk_caching_type

        min_value.has_resource_disk = self._generate_min_capability_has_resource_disk(
            self.has_resource_disk, capability.has_resource_disk
        )

        return min_value