Pick cheapest GPU SKU and pin the VM to an existing disk AZ.

Scan ru-6 by Nova availability zones (a/b/c). First boot uses FLAVOR_SIZE_PRESET=cheap; reruns stay on the disk segment.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Leonid Pershin
2026-08-22 00:06:44 +03:00
co-authored by Cursor
parent 5d0c30f66b
commit 789fa26918
19 changed files with 666 additions and 71 deletions
+55 -3
View File
@@ -9,13 +9,25 @@ from gpu_rent.inventory import (
class FakeFlavor:
def __init__(self, flavor_id: str, name: str, extra=None, disabled: bool = False):
def __init__(
self,
flavor_id: str,
name: str,
extra=None,
disabled: bool = False,
vcpus: int = 8,
ram: int = 32768,
disk: int = 0,
availability_zones=None,
):
self.id = flavor_id
self.name = name
self.extra_specs = extra or {}
self.is_disabled = disabled
self.vcpus = 8
self.ram = 32768
self.vcpus = vcpus
self.ram = ram
self.disk = disk
self.availability_zones = list(availability_zones or [])
def test_match_4090_24_not_48():
@@ -74,6 +86,46 @@ def test_resolve_flavor_no_fallback_requires_default():
assert picked.id == "ok"
def test_rank_cheap_prefers_1gpu_min_sku():
extra = {"aggregate_instance_extra_specs:gpu": "RTX4090", "gpu_memory": "24"}
flavors = [
FakeFlavor("dual", "GL10.8-65536-0-2GPU", extra, vcpus=8, ram=65536),
FakeFlavor("fat", "GL10.8-32768-0-1GPU", extra, vcpus=8, ram=32768),
FakeFlavor("tiny", "GL10.4-16384-0-1GPU", extra, vcpus=4, ram=16384),
]
ranked = rank_flavors(flavors, ("4090-24",), size_preset="cheap")
assert ranked[0].id == "tiny"
assert ranked[0].gpu_count == 1
balanced = rank_flavors(flavors, ("4090-24",), size_preset="balanced")
assert balanced[0].id == "fat"
def test_rank_filters_availability_zone():
extra = {"aggregate_instance_extra_specs:gpu": "RTX4090", "gpu_memory": "24"}
flavors = [
FakeFlavor(
"a",
"GL10.4-16384-0-1GPU",
extra,
vcpus=4,
ram=16384,
availability_zones=["ru-6a"],
),
FakeFlavor(
"h200",
"GL-H200",
{"aggregate_instance_extra_specs:gpu": "H200"},
vcpus=12,
ram=120000,
availability_zones=["ru-6b"],
),
]
in_a = rank_flavors(flavors, ("4090-24", "a5000"), az="ru-6a")
assert [x.id for x in in_a] == ["a"]
in_b = rank_flavors(flavors, ("4090-24",), az="ru-6b")
assert in_b == []
def test_pick_boot_image_prefers_24_580_without_docker():
class Img:
def __init__(self, name):