Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/firebolt/model/instance_type.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ class InstanceType(FireboltBaseModel):
# optional
is_spot_available: Optional[bool]
cpu_virtual_cores_count: Optional[int]
memory_size_bytes: Optional[str]
storage_size_bytes: Optional[str]
memory_size_bytes: Optional[int]
storage_size_bytes: Optional[int]
price_per_hour_cents: Optional[float]
create_time: Optional[datetime]
last_update_time: Optional[datetime]
19 changes: 14 additions & 5 deletions src/firebolt/service/instance_type.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,23 +42,32 @@ def instance_types_by_name(self) -> Dict[InstanceTypeLookup, InstanceType]:
for i in self.instance_types
}

def cheapest_instance_in_region(self, region: Region) -> Optional[InstanceType]:
# Get only awailable instances in region
def get_instance_types_per_region(self, region: Region) -> List[InstanceType]:
"""List of instance types available on Firebolt in specified region."""

response = self.client.get(
url=INSTANCE_TYPES_URL,
params={"page.first": 5000, "filter.id_region_id_eq": region.key.region_id},
)
instance_types = [

instance_list = [
InstanceType.parse_obj(i["node"]) for i in response.json()["edges"]
]

# Filter out instances without storage
instance_list = [
return [
i
for i in instance_types
for i in instance_list
if i.storage_size_bytes and i.storage_size_bytes != "0"
]

def cheapest_instance_in_region(self, region: Region) -> Optional[InstanceType]:
# Get only available instances in region
instance_list = self.get_instance_types_per_region(region)

if not instance_list:
return None

cheapest = min(
instance_list,
key=lambda x: x.price_per_hour_cents
Expand Down