11import ipaddress
22import uuid
3+ from collections .abc import Container , Iterable
34from datetime import datetime , timezone
45from typing import List , Optional
56
@@ -69,37 +70,54 @@ async def list_project_pools(session: AsyncSession, project: ProjectModel) -> Li
6970
7071
7172async def get_pool (
72- session : AsyncSession , project : ProjectModel , pool_name : str , select_deleted : bool = False
73+ session : AsyncSession ,
74+ project : ProjectModel ,
75+ pool_name : str ,
76+ select_deleted : bool = False ,
77+ load_instance_fleets : bool = False ,
7378) -> Optional [PoolModel ]:
7479 filters = [
7580 PoolModel .name == pool_name ,
7681 PoolModel .project_id == project .id ,
7782 ]
7883 if not select_deleted :
7984 filters .append (PoolModel .deleted == False )
80- res = await session .scalars (select (PoolModel ).where (* filters ))
85+ query = select (PoolModel ).where (* filters )
86+ if load_instance_fleets :
87+ query = query .options (joinedload (PoolModel .instances , InstanceModel .fleet ))
88+ res = await session .scalars (query )
8189 return res .one_or_none ()
8290
8391
8492async def get_or_create_pool_by_name (
85- session : AsyncSession , project : ProjectModel , pool_name : Optional [str ]
93+ session : AsyncSession ,
94+ project : ProjectModel ,
95+ pool_name : Optional [str ],
96+ load_instance_fleets : bool = False ,
8697) -> PoolModel :
8798 if pool_name is None :
8899 if project .default_pool_id is not None :
89- return await get_default_pool_or_error (session , project )
90- default_pool = await get_pool (session , project , DEFAULT_POOL_NAME )
100+ return await get_default_pool_or_error (session , project , load_instance_fleets )
101+ default_pool = await get_pool (
102+ session , project , DEFAULT_POOL_NAME , load_instance_fleets = load_instance_fleets
103+ )
91104 if default_pool is not None :
92105 await set_default_pool (session , project , DEFAULT_POOL_NAME )
93106 return default_pool
94107 return await create_pool (session , project , DEFAULT_POOL_NAME )
95- pool = await get_pool (session , project , pool_name )
108+ pool = await get_pool (session , project , pool_name , load_instance_fleets = load_instance_fleets )
96109 if pool is not None :
97110 return pool
98111 return await create_pool (session , project , pool_name )
99112
100113
101- async def get_default_pool_or_error (session : AsyncSession , project : ProjectModel ) -> PoolModel :
102- res = await session .execute (select (PoolModel ).where (PoolModel .id == project .default_pool_id ))
114+ async def get_default_pool_or_error (
115+ session : AsyncSession , project : ProjectModel , load_instance_fleets : bool = False
116+ ) -> PoolModel :
117+ query = select (PoolModel ).where (PoolModel .id == project .default_pool_id )
118+ if load_instance_fleets :
119+ query = query .options (joinedload (PoolModel .instances , InstanceModel .fleet ))
120+ res = await session .execute (query )
103121 return res .scalar_one ()
104122
105123
@@ -201,11 +219,13 @@ async def show_pool_instances(
201219 session : AsyncSession , project : ProjectModel , pool_name : Optional [str ]
202220) -> PoolInstances :
203221 if pool_name is not None :
204- pool = await get_pool (session , project , pool_name )
222+ pool = await get_pool (session , project , pool_name , load_instance_fleets = True )
205223 if pool is None :
206224 raise ResourceNotExistsError ("Pool not found" )
207225 else :
208- pool = await get_or_create_pool_by_name (session , project , pool_name )
226+ pool = await get_or_create_pool_by_name (
227+ session , project , pool_name , load_instance_fleets = True
228+ )
209229 pool_instances = get_pool_instances (pool )
210230 instances = list (map (instance_model_to_instance , pool_instances ))
211231 return PoolInstances (
@@ -223,6 +243,8 @@ def instance_model_to_instance(instance_model: InstanceModel) -> Instance:
223243 id = instance_model .id ,
224244 project_name = instance_model .project .name ,
225245 name = instance_model .name ,
246+ fleet_id = instance_model .fleet_id ,
247+ fleet_name = instance_model .fleet .name if instance_model .fleet else None ,
226248 instance_num = instance_model .instance_num ,
227249 status = instance_model .status ,
228250 unreachable = instance_model .unreachable ,
@@ -478,6 +500,7 @@ def filter_pool_instances(
478500async def list_pools_instance_models (
479501 session : AsyncSession ,
480502 projects : List [ProjectModel ],
503+ fleet_ids : Optional [Iterable [uuid .UUID ]],
481504 pool : Optional [PoolModel ],
482505 only_active : bool ,
483506 prev_created_at : Optional [datetime ],
@@ -488,6 +511,8 @@ async def list_pools_instance_models(
488511 filters : List = [
489512 InstanceModel .project_id .in_ (p .id for p in projects ),
490513 ]
514+ if fleet_ids is not None :
515+ filters .append (InstanceModel .fleet_id .in_ (fleet_ids ))
491516 if pool is not None :
492517 filters .append (InstanceModel .pool_id == pool .id )
493518 if only_active :
@@ -533,7 +558,7 @@ async def list_pools_instance_models(
533558 .where (* filters )
534559 .order_by (* order_by )
535560 .limit (limit )
536- .options (joinedload (InstanceModel .pool ))
561+ .options (joinedload (InstanceModel .pool ), joinedload ( InstanceModel . fleet ) )
537562 )
538563 instance_models = list (res .scalars ().all ())
539564 return instance_models
@@ -542,7 +567,8 @@ async def list_pools_instance_models(
542567async def list_user_pool_instances (
543568 session : AsyncSession ,
544569 user : UserModel ,
545- project_name : Optional [str ],
570+ project_names : Optional [Container [str ]],
571+ fleet_ids : Optional [Iterable [uuid .UUID ]],
546572 pool_name : Optional [str ],
547573 only_active : bool ,
548574 prev_created_at : Optional [datetime ],
@@ -558,8 +584,8 @@ async def list_user_pool_instances(
558584 return []
559585
560586 pool = None
561- if project_name is not None :
562- projects = [proj for proj in projects if proj .name == project_name ]
587+ if project_names is not None :
588+ projects = [proj for proj in projects if proj .name in project_names ]
563589 if len (projects ) == 0 :
564590 return []
565591 if pool_name is not None :
@@ -573,6 +599,7 @@ async def list_user_pool_instances(
573599 instance_models = await list_pools_instance_models (
574600 session = session ,
575601 projects = projects ,
602+ fleet_ids = fleet_ids ,
576603 pool = pool ,
577604 only_active = only_active ,
578605 prev_created_at = prev_created_at ,
0 commit comments