@@ -1050,6 +1050,122 @@ def get_links(self, *, node_id: str, states: list[int], rsv_type: list[str],
10501050 raise e
10511051 return result
10521052
1053+ def get_link_allocations (self , * , states : list [int ], rsv_type : list [str ],
1054+ start : datetime = None , end : datetime = None ) -> list [dict ]:
1055+ """
1056+ Return per-reservation link allocation data with lease times.
1057+
1058+ Each dict contains: link_node_id, bw, lease_start, lease_end.
1059+ This avoids deserializing full slivers for network service reservations.
1060+
1061+ @param states: list of reservation states to include
1062+ @param rsv_type: list of reservation types (ServiceType strings)
1063+ @param start: start of time range
1064+ @param end: end of time range
1065+ @return list of dicts with link allocation data
1066+ """
1067+ result = []
1068+ session = self .get_session ()
1069+ try :
1070+ lease_end_filter = True
1071+ if start is not None or end is not None :
1072+ if start is not None and end is not None :
1073+ lease_end_filter = or_ (
1074+ and_ (start <= Reservations .lease_end , Reservations .lease_end <= end ),
1075+ and_ (start <= Reservations .lease_start , Reservations .lease_start <= end ),
1076+ and_ (Reservations .lease_start <= start , Reservations .lease_end >= end )
1077+ )
1078+ elif start is not None :
1079+ lease_end_filter = start <= Reservations .lease_end
1080+ elif end is not None :
1081+ lease_end_filter = Reservations .lease_end <= end
1082+
1083+ rows = (
1084+ session .query (
1085+ Links .node_id ,
1086+ Links .bw ,
1087+ Reservations .lease_start ,
1088+ Reservations .lease_end ,
1089+ Reservations .site ,
1090+ )
1091+ .join (Reservations , Links .reservation_id == Reservations .rsv_id )
1092+ .filter (Reservations .rsv_type .in_ (rsv_type ))
1093+ .filter (Reservations .rsv_state .in_ (states ))
1094+ .filter (lease_end_filter )
1095+ .all ()
1096+ )
1097+
1098+ for row in rows :
1099+ result .append ({
1100+ "link_node_id" : row [0 ],
1101+ "bw" : row [1 ] or 0 ,
1102+ "lease_start" : row [2 ],
1103+ "lease_end" : row [3 ],
1104+ "site" : row [4 ],
1105+ })
1106+ except Exception as e :
1107+ self .logger .error (Constants .EXCEPTION_OCCURRED .format (e ))
1108+ raise e
1109+ return result
1110+
1111+ def get_component_allocations (self , * , states : list [int ],
1112+ start : datetime = None , end : datetime = None ) -> list [dict ]:
1113+ """
1114+ Return per-reservation component allocation data with lease times and host info.
1115+
1116+ Each dict contains: host, site, lease_start, lease_end, component (name), bdf.
1117+ This avoids deserializing full slivers for component counting.
1118+
1119+ @param states: list of reservation states to include
1120+ @param start: start of time range
1121+ @param end: end of time range
1122+ @return list of dicts with component allocation data
1123+ """
1124+ result = []
1125+ session = self .get_session ()
1126+ try :
1127+ lease_end_filter = True
1128+ if start is not None or end is not None :
1129+ if start is not None and end is not None :
1130+ lease_end_filter = or_ (
1131+ and_ (start <= Reservations .lease_end , Reservations .lease_end <= end ),
1132+ and_ (start <= Reservations .lease_start , Reservations .lease_start <= end ),
1133+ and_ (Reservations .lease_start <= start , Reservations .lease_end >= end )
1134+ )
1135+ elif start is not None :
1136+ lease_end_filter = start <= Reservations .lease_end
1137+ elif end is not None :
1138+ lease_end_filter = Reservations .lease_end <= end
1139+
1140+ rows = (
1141+ session .query (
1142+ Reservations .host ,
1143+ Reservations .site ,
1144+ Reservations .lease_start ,
1145+ Reservations .lease_end ,
1146+ Components .component ,
1147+ Components .bdf ,
1148+ )
1149+ .join (Components , Components .reservation_id == Reservations .rsv_id )
1150+ .filter (Reservations .rsv_state .in_ (states ))
1151+ .filter (lease_end_filter )
1152+ .all ()
1153+ )
1154+
1155+ for row in rows :
1156+ result .append ({
1157+ "host" : row [0 ],
1158+ "site" : row [1 ],
1159+ "lease_start" : row [2 ],
1160+ "lease_end" : row [3 ],
1161+ "component" : row [4 ],
1162+ "bdf" : row [5 ],
1163+ })
1164+ except Exception as e :
1165+ self .logger .error (Constants .EXCEPTION_OCCURRED .format (e ))
1166+ raise e
1167+ return result
1168+
10531169 def get_reservations_by_rids (self , * , rsv_resid_list : list ) -> list :
10541170 """
10551171 Get Reservations for an actor by reservation ids
0 commit comments