14
14
from stf_client .api .user_api import UserApi
15
15
from stf_client .api .devices_api import DevicesApi
16
16
17
+ STATUS_ONLINE = 3
18
+
17
19
18
20
class StfClient (Logger ):
19
21
DEFAULT_ALLOCATION_TIMEOUT_SECONDS = 900
@@ -148,11 +150,12 @@ def release(self, device: dict) -> None:
148
150
device ['owner' ] = None
149
151
self .logger .info (f'{ serial } : released' )
150
152
151
- def list_devices (self , requirements : dict , fields : str = "" ) -> list :
153
+ def list_devices (self , requirements : dict , fields : str = "" , available_filter : bool = True ) -> list :
152
154
"""
153
155
Get list of devices filtered by given requirements and optional extra fields
154
156
:param requirements: filter dictionary
155
157
:param fields: extra fields to include
158
+ :param available_filter: filter only available devices
156
159
:return: list of objects that represent devices
157
160
"""
158
161
req_keys = list (requirements .keys ())
@@ -165,15 +168,15 @@ def list_devices(self, requirements: dict, fields: str = "") -> list:
165
168
fields = uniq (req_keys )
166
169
167
170
predicate = requirements .copy ()
168
-
169
- predicate .update (
170
- dict (
171
- present = True ,
172
- ready = True ,
173
- using = False ,
174
- owner = None ,
175
- status = 3 ) # 3=Online
176
- )
171
+ if available_filter :
172
+ predicate .update (
173
+ dict (
174
+ present = True ,
175
+ ready = True ,
176
+ using = False ,
177
+ owner = None ,
178
+ status = STATUS_ONLINE )
179
+ )
177
180
178
181
self .logger .debug (
179
182
f"Find devices with requirements: { json .dumps (requirements )} , using fields: { ',' .join (fields )} " )
@@ -182,6 +185,12 @@ def list_devices(self, requirements: dict, fields: str = "") -> list:
182
185
183
186
return filter_ (devices , predicate )
184
187
188
+ def list_online_devices (self , requirements : dict ):
189
+ suitable_devices = self .list_devices (requirements = requirements )
190
+ online = filter (lambda device : device .get ('status' ) == STATUS_ONLINE , suitable_devices )
191
+ return list (online )
192
+
193
+
185
194
def find_and_allocate (self , requirements : dict ,
186
195
timeout_seconds : int = DEFAULT_ALLOCATION_TIMEOUT_SECONDS ,
187
196
shuffle : bool = True ) -> dict :
@@ -197,7 +206,7 @@ def find_and_allocate(self, requirements: dict,
197
206
:raises DeviceNotFound: suitable device not found or all devices are allocated already
198
207
"""
199
208
NotConnectedError .invariant (self ._client , 'Not connected' )
200
- suitable_devices = self .list_devices (requirements = requirements )
209
+ suitable_devices = self .list_online_devices (requirements = requirements )
201
210
DeviceNotFound .invariant (len (suitable_devices ), 'no suitable devices found' )
202
211
if shuffle :
203
212
random .shuffle (suitable_devices )
@@ -233,6 +242,12 @@ def find_wait_and_allocate(self,
233
242
:return: device dictionary
234
243
"""
235
244
wait_until = time .time () + wait_timeout
245
+
246
+ # Fail fast if no suitable devices
247
+ suitable_devices = self .list_devices (requirements = requirements , available_filter = False )
248
+ if not suitable_devices :
249
+ raise DeviceNotFound (f'No suitable devices found ({ json .dumps (requirements )} )' )
250
+
236
251
print (f'wait_until: { wait_until } ' )
237
252
while True :
238
253
remaining_time = int (wait_until - time .time ())
0 commit comments