1111import sys
1212import time as tm
1313import platform
14+ import uuid
1415import requests
15- import randomname
1616
1717from .worker import Worker
1818from .simvue import Simvue
@@ -127,6 +127,7 @@ class Run(object):
127127 Track simulation details based on token and URL
128128 """
129129 def __init__ (self , mode = 'online' ):
130+ self ._uuid = str (uuid .uuid4 ())
130131 self ._mode = mode
131132 self ._name = None
132133 self ._suppress_errors = False
@@ -186,6 +187,7 @@ def _start(self, reconnect=False):
186187 self ._events_queue = multiprocessing .Manager ().Queue (maxsize = self ._queue_size )
187188 self ._worker = Worker (self ._metrics_queue ,
188189 self ._events_queue ,
190+ self ._uuid ,
189191 self ._name ,
190192 self ._url ,
191193 self ._headers ,
@@ -217,14 +219,12 @@ def init(self, name=None, metadata={}, tags=[], description=None, folder='/', ru
217219 if self ._mode == 'disabled' :
218220 return True
219221
220- if not name :
221- name = randomname .get_name ()
222-
223222 if not self ._token or not self ._url :
224223 self ._error ('Unable to get URL and token from environment variables or config file' )
225224
226- if not re .match (r'^[a-zA-Z0-9\-\_\s\/\.:]+$' , name ):
227- self ._error ('specified name is invalid' )
225+ if name :
226+ if not re .match (r'^[a-zA-Z0-9\-\_\s\/\.:]+$' , name ):
227+ self ._error ('specified name is invalid' )
228228
229229 if not isinstance (tags , list ):
230230 self ._error ('tags must be a list' )
@@ -239,14 +239,16 @@ def init(self, name=None, metadata={}, tags=[], description=None, folder='/', ru
239239 else :
240240 self ._status = 'created'
241241
242- data = {'name' : name ,
243- 'metadata' : metadata ,
242+ data = {'metadata' : metadata ,
244243 'tags' : tags ,
245244 'system' : {'cpu' : {},
246245 'gpu' : {},
247246 'platform' : {}},
248247 'status' : self ._status }
249248
249+ if name :
250+ data ['name' ] = name
251+
250252 if description :
251253 data ['description' ] = description
252254
@@ -260,13 +262,16 @@ def init(self, name=None, metadata={}, tags=[], description=None, folder='/', ru
260262
261263 self ._check_token ()
262264
263- self ._simvue = Simvue (self ._name , self ._mode , self ._suppress_errors )
264- if not self ._simvue .create_run (data ):
265+ self ._simvue = Simvue (self ._name , self ._uuid , self ._mode , self ._suppress_errors )
266+ name = self ._simvue .create_run (data )
267+
268+ if not name :
265269 return False
270+ elif name is not True :
271+ self ._name = name
266272
267273 if self ._status == 'running' :
268274 self ._start ()
269-
270275 return True
271276
272277 @property
@@ -276,7 +281,14 @@ def name(self):
276281 """
277282 return self ._name
278283
279- def reconnect (self , name ):
284+ @property
285+ def uid (self ):
286+ """
287+ Return the local unique identifier of the run
288+ """
289+ return self ._uuid
290+
291+ def reconnect (self , name = None , uid = None ):
280292 """
281293 Reconnect to a run in the created state
282294 """
@@ -285,7 +297,9 @@ def reconnect(self, name):
285297
286298 self ._status = 'running'
287299 self ._name = name
288- self ._simvue = Simvue (self ._name , self ._mode , self ._suppress_errors )
300+ self ._uuid = uid
301+
302+ self ._simvue = Simvue (self ._name , self ._uuid , self ._mode , self ._suppress_errors )
289303 self ._start (reconnect = True )
290304
291305 def set_pid (self , pid ):
@@ -332,7 +346,7 @@ def update_metadata(self, metadata):
332346 if self ._mode == 'disabled' :
333347 return True
334348
335- if not self ._name :
349+ if not self ._uuid and not self . _name :
336350 self ._error (INIT_MISSING )
337351 return False
338352
@@ -358,7 +372,7 @@ def update_tags(self, tags):
358372 if self ._mode == 'disabled' :
359373 return True
360374
361- if not self ._name :
375+ if not self ._uuid and not self . _name :
362376 self ._error (INIT_MISSING )
363377 return False
364378
@@ -380,7 +394,7 @@ def log_event(self, message, timestamp=None):
380394 if self ._mode == 'disabled' :
381395 return True
382396
383- if not self ._name :
397+ if not self ._uuid and not self . _name :
384398 self ._error (INIT_MISSING )
385399 return False
386400
@@ -417,7 +431,7 @@ def log_metrics(self, metrics, step=None, time=None, timestamp=None):
417431 if self ._mode == 'disabled' :
418432 return True
419433
420- if not self ._name :
434+ if not self ._uuid and not self . _name :
421435 self ._error (INIT_MISSING )
422436 return False
423437
@@ -468,7 +482,7 @@ def save(self, filename, category, filetype=None, preserve_path=False):
468482 if self ._mode == 'disabled' :
469483 return True
470484
471- if not self ._name :
485+ if not self ._uuid and not self . _name :
472486 self ._error (INIT_MISSING )
473487 return False
474488
@@ -527,7 +541,7 @@ def save_directory(self, directory, category, filetype=None, preserve_path=False
527541 if self ._mode == 'disabled' :
528542 return True
529543
530- if not self ._name :
544+ if not self ._uuid and not self . _name :
531545 self ._error (INIT_MISSING )
532546 return False
533547
@@ -577,7 +591,7 @@ def set_status(self, status):
577591 if self ._mode == 'disabled' :
578592 return True
579593
580- if not self ._name :
594+ if not self ._uuid and not self . _name :
581595 self ._error (INIT_MISSING )
582596 return False
583597
@@ -603,7 +617,7 @@ def close(self):
603617 if self ._mode == 'disabled' :
604618 return True
605619
606- if not self ._name :
620+ if not self ._uuid and not self . _name :
607621 self ._error (INIT_MISSING )
608622 return False
609623
@@ -620,7 +634,7 @@ def set_folder_details(self, path, metadata={}, tags=[], description=None):
620634 if self ._mode == 'disabled' :
621635 return True
622636
623- if not self ._name :
637+ if not self ._uuid and not self . _name :
624638 self ._error (INIT_MISSING )
625639 return False
626640
@@ -670,7 +684,7 @@ def add_alert(self,
670684 if self ._mode == 'disabled' :
671685 return True
672686
673- if not self ._name :
687+ if not self ._uuid and not self . _name :
674688 self ._error (INIT_MISSING )
675689 return False
676690
0 commit comments