11
11
import io
12
12
import pathlib
13
13
import json
14
+ import sys
14
15
import typing
15
16
import time
17
+ from simvue .exception import ObjectNotFoundError
16
18
import toml
17
19
import venv
18
20
import shutil
@@ -61,7 +63,7 @@ def _check_run_exists(run_id: str) -> tuple[pathlib.Path, Run]:
61
63
62
64
try :
63
65
run = Run (identifier = run_id )
64
- except StopIteration as e :
66
+ except ObjectNotFoundError as e :
65
67
if run_shelf_file .exists ():
66
68
run_shelf_file .unlink ()
67
69
raise ValueError (f"Run '{ run_id } ' does not exist." ) from e
@@ -94,7 +96,7 @@ def create_simvue_run(
94
96
timeout : int | None ,
95
97
retention : int | None ,
96
98
environment : bool ,
97
- ) -> str | None :
99
+ ) -> Run | None :
98
100
"""Create and initialise a new Simvue run
99
101
100
102
Parameters
@@ -120,8 +122,8 @@ def create_simvue_run(
120
122
Returns
121
123
-------
122
124
123
- str | None
124
- Simvue run ID if successful else None
125
+ Run | None
126
+ Simvue run if successful else None
125
127
"""
126
128
if folder != "/" :
127
129
try :
@@ -156,7 +158,7 @@ def create_simvue_run(
156
158
indent = 2 ,
157
159
)
158
160
159
- return _id
161
+ return _run
160
162
161
163
162
164
def log_metrics (run_id : str , metrics : dict [str , int | float ]) -> None :
@@ -291,40 +293,51 @@ def user_info() -> dict:
291
293
return Stats ().whoami ()
292
294
293
295
294
- def get_runs_list (** kwargs ) -> typing .Generator [tuple [str , Run ], None , None ]:
296
+ def get_runs_list (
297
+ sort_by : list [str ], reverse : bool , ** kwargs
298
+ ) -> typing .Generator [tuple [str , Run ], None , None ]:
295
299
"""Retrieve list of Simvue runs"""
296
- return Run .get (** kwargs )
300
+ _sorting : list [dict [str , str ]] = [
301
+ {"column" : c , "descending" : not reverse } for c in sort_by
302
+ ]
303
+ return Run .get (sorting = _sorting , ** kwargs )
297
304
298
305
299
306
def get_alerts_list (
300
- ** kwargs ,
307
+ sort_by : list [ str ], reverse : bool , ** kwargs
301
308
) -> typing .Generator [
302
309
tuple [str , MetricsRangeAlert | MetricsThresholdAlert | EventsAlert | UserAlert ],
303
310
None ,
304
311
None ,
305
312
]:
306
313
"""Retrieve list of Simvue alerts"""
307
- return Alert .get (** kwargs )
314
+ _sorting : list [dict [str , str ]] = [
315
+ {"column" : c , "descending" : not reverse } for c in sort_by
316
+ ]
317
+ return Alert .get (sorting = _sorting , ** kwargs )
308
318
309
319
310
- def get_tag_list (** kwargs ) -> None :
320
+ def get_tag_list (sort_by : list [ str ], reverse : bool , ** kwargs ) -> None :
311
321
"""Retrieve list of Simvue tags"""
312
- return Tag .get (** kwargs )
322
+ _sorting : list [dict [str , str ]] = [
323
+ {"column" : c , "descending" : not reverse } for c in sort_by
324
+ ]
325
+ return Tag .get (sorting = _sorting , ** kwargs )
313
326
314
327
315
328
def get_storages_list (** kwargs ) -> typing .Generator [tuple [str , Storage ], None , None ]:
316
329
"""Retrieve list of Simvue storages"""
317
330
return Storage .get (** kwargs )
318
331
319
332
320
- def get_storage_list ( ** kwargs ) -> None :
321
- """Retrieve list of Simvue storages"""
322
- return Storage . get ( ** kwargs )
323
-
324
-
325
- def get_folders_list ( ** kwargs ) -> None :
326
- """Retrieve list of Simvue runs"""
327
- return Folder .get (** kwargs )
333
+ def get_folders_list (
334
+ sort_by : list [ str ], reverse : bool , ** kwargs
335
+ ) -> typing . Generator [ tuple [ str , Run ], None , None ]:
336
+ """Retrieve list of Simvue folders"""
337
+ _sorting : list [ dict [ str , str ]] = [
338
+ { "column" : c , "descending" : not reverse } for c in sort_by
339
+ ]
340
+ return Folder .get (sorting = _sorting , ** kwargs )
328
341
329
342
330
343
def get_tenants_list (** kwargs ) -> typing .Generator [tuple [str , Tenant ], None , None ]:
@@ -337,9 +350,14 @@ def get_users_list(**kwargs) -> typing.Generator[tuple[str, User], None, None]:
337
350
return User .get (** kwargs )
338
351
339
352
340
- def get_artifacts_list (** kwargs ) -> typing .Generator [tuple [str , Artifact ], None , None ]:
353
+ def get_artifacts_list (
354
+ sort_by : list [str ], reverse : bool , ** kwargs
355
+ ) -> typing .Generator [tuple [str , Artifact ], None , None ]:
341
356
"""Retrieve list of Simvye artifacts"""
342
- return Artifact .get (** kwargs )
357
+ _sorting : list [dict [str , str ]] = [
358
+ {"column" : c , "descending" : not reverse } for c in sort_by
359
+ ]
360
+ return Artifact .get (sorting = _sorting , ** kwargs )
343
361
344
362
345
363
def get_run (run_id : str ) -> Run :
@@ -370,7 +388,7 @@ def create_simvue_s3_storage(
370
388
access_key_file : io .BytesIO ,
371
389
block_tenant : bool ,
372
390
** kwargs ,
373
- ) -> str :
391
+ ) -> S3Storage :
374
392
_secret_key : str = access_key_file .read ()
375
393
_storage = S3Storage .new (
376
394
is_enabled = not disable ,
@@ -380,7 +398,7 @@ def create_simvue_s3_storage(
380
398
** kwargs ,
381
399
)
382
400
_storage .commit ()
383
- return _storage . id
401
+ return _storage
384
402
385
403
386
404
def create_user_alert (
@@ -424,7 +442,7 @@ def create_simvue_user(
424
442
read_only : bool ,
425
443
tenant : str ,
426
444
welcome : bool ,
427
- ) -> str :
445
+ ) -> User :
428
446
"""Create a new Simvue user on the server.
429
447
430
448
Parameters
@@ -451,8 +469,8 @@ def create_simvue_user(
451
469
452
470
Returns
453
471
-------
454
- str
455
- the unique identifier for the user
472
+ User
473
+ the user object
456
474
"""
457
475
_user = User .new (
458
476
username = username ,
@@ -467,7 +485,7 @@ def create_simvue_user(
467
485
)
468
486
_user .commit ()
469
487
470
- return _user . id
488
+ return _user
471
489
472
490
473
491
def create_simvue_tenant (
@@ -476,7 +494,7 @@ def create_simvue_tenant(
476
494
max_runs : int ,
477
495
max_request_rate : int ,
478
496
max_data_volume : int ,
479
- ) -> str :
497
+ ) -> Tenant :
480
498
"""Create a Tenant on the simvue server.
481
499
482
500
Parameters
@@ -494,8 +512,8 @@ def create_simvue_tenant(
494
512
495
513
Returns
496
514
-------
497
- str
498
- the unique identifer for the user
515
+ Tenant
516
+ the tenant object
499
517
"""
500
518
_tenant = Tenant .new (
501
519
name = name ,
@@ -505,7 +523,7 @@ def create_simvue_tenant(
505
523
max_data_volume = max_data_volume or 0 ,
506
524
)
507
525
_tenant .commit ()
508
- return _tenant . id
526
+ return _tenant
509
527
510
528
511
529
def get_tenant (tenant_id : str ) -> Tenant :
@@ -617,4 +635,11 @@ def create_environment(
617
635
618
636
toml .dump (_toml_data , _toml_file .open ("w" ))
619
637
620
- subprocess .run ([_cargo_path , "build" ], cwd = venv_directory )
638
+ _process = subprocess .Popen (
639
+ [_cargo_path , "build" ],
640
+ cwd = venv_directory ,
641
+ stdout = subprocess .PIPE ,
642
+ stderr = subprocess .STDOUT ,
643
+ )
644
+ for c in iter (lambda : _process .stdout .read (1 ), b"" ):
645
+ sys .stdout .buffer .write (c )
0 commit comments