From 717d5da4866f594295336ef94277f2da21a78856 Mon Sep 17 00:00:00 2001 From: Yury Dzerin Date: Fri, 6 May 2022 14:09:03 +0300 Subject: [PATCH] feat: add method for getting all instance of specific region --- src/firebolt/model/instance_type.py | 4 ++-- src/firebolt/service/instance_type.py | 19 ++++++++++++++----- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/firebolt/model/instance_type.py b/src/firebolt/model/instance_type.py index ed99fcfda9f..24decd63006 100644 --- a/src/firebolt/model/instance_type.py +++ b/src/firebolt/model/instance_type.py @@ -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] diff --git a/src/firebolt/service/instance_type.py b/src/firebolt/service/instance_type.py index 5b1c1b8fbc8..3e1447de1a4 100644 --- a/src/firebolt/service/instance_type.py +++ b/src/firebolt/service/instance_type.py @@ -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